Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
На десерт всем домоSEDам сообщу, существует в природе еще такая утилита Super-sed. В репозитории debian-testing имеет название пакета ssed. Это потоковый редактор способный понимать перловские регулярные выражения.
echo "01234abcde" | ssed -R 's/(\d+)(\w+)/\2/'
echo "01234abcde" | sed -r 's/(\d+)(\w+)/\2/'
Просто для домоSEDов, вот справка из официальной документации:
Regex syntax clashes (problems with backslashes)
sed uses the posix basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of sed are |, +, \?, `, \', \<, >, \b, \B, \w, and \W.
As in all GNU programs that use posix basic regular expressions, sed interprets these escape sequences as special characters. So, x+ matches one or more occurrences of ‘x’. abc|def matches either ‘abc’ or ‘def’.
…
In addition, this version of sed supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (\a, \c, \d, \o, \r, \t, \v, \x). These can cause similar problems with scripts written for other seds.
Так что \d в GNU sed просто значит не то, что это значит в Perl и многих других реализациях парсеров регулярных выражений. Рекомендуют использовать либо явно [0-9], либо [[:digit:]].
#!/usr/bin/env bash
sed -r '/^[-+/%*]\*?-?[0-9]+$/{x;G;s/\n//}; s/.*/echo $((&))/e;h'
chmod 755 calc
sudo mv calc /usr/local/bin/
#!/usr/bin/sed -rf
/^[-+/%*]\*?-?[0-9]+$/{x;G;s/\n//}
s/.*/echo $((&))/e
h

Блестяще и действительно не скучно. Я раньше дfже не подозревал что в sed есть модификатор /e
sed 's/.*/echo $((&))/e' <<<"2+2"
s/9/#########/; s/8/########/; ну и так далее
s/(#\+)0/\1\1\1\1\1\1\1\1\1\1/; s/(#\+)1/\1\1\1\1\1\1\1\1\1\1#/; ну и так далее
Нескучный однострочный калькулятор на sed