Комментарии 26
На десерт всем домоSEDам сообщу, существует в природе еще такая утилита Super-sed. В репозитории debian-testing имеет название пакета ssed. Это потоковый редактор способный понимать перловские регулярные выражения.
ssed это же вроде форк третьего gnu sed, а в моем дистрибутиве gnu sed уже 4 версии. Какие PCRE в нем не поддерживаются можете пример привести? Речь ведь про sed -r?
0
Вот с чем сама сталкивалась. Можете посмотреть на разницу в выводах двух команд.
echo "01234abcde" | ssed -R 's/(\d+)(\w+)/\2/'
echo "01234abcde" | sed -r 's/(\d+)(\w+)/\2/'
+2
Спасибо
0
Просто для домо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:]]
.
+1
Спасибо. Было интересно.
0
Спасибо за краткое введение, я как-то vim'ом больше пользуюсь, ибо там наглядно изменения происходят. И загляните, пожалуйста, в личку: там небольшие правки грамматики.
+1
НЛО прилетело и опубликовало эту надпись здесь
bc
+1
Это еще одна очень нескучная тема. с большим удовольствием прочла этот пост. пасьянс на bc. Если на калькуляторе делают игру, почему в редакторе не создать калькулятор?
+3
А можно версию для прописывания в alias (e.g. /root/.bashrc)? :)
0
На мой взгляд для практического применения лючше питона, элаяса не придумаешь. Наберите в командной строке: python И работатайте точно так же только без буфера. Выход по команде exit(). Но если хотите быть последовательным, создайте файл например с именем calc:
Сделайте его исполняемым:
И переместите например сюда:
Теперь можете набрать в терминале слово calc и проверить работоспособность калькулятора.
#!/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/
Теперь можете набрать в терминале слово calc и проверить работоспособность калькулятора.
+1
Возможен такой вариант:
#!/usr/bin/sed -rf
/^[-+/%*]\*?-?[0-9]+$/{x;G;s/\n//}
s/.*/echo $((&))/e
h
+1
i3wm detected :)
0
Блестяще и действительно не скучно. Я раньше дfже не подозревал что в sed есть модификатор /e
0
Я бы был очень рад, если бы в ближайшем будущем кто нибудь написал аналог программы Soulver для Linux.
0
Ну, вообще-то это калькулятор не на sed, а на bash. Тут sed просто разбивает строку на аргументы и вызывает, bash. Можно было бы и не разбивать (как, собственно, в конце статьи и делается):
Настоящий калькулятор на sed гораздо сложнее. Один подход (я тут быстро нагуглил, не сам придумал) — это сперва серией подстановок превратить число в строку одинаковых символов:
с десятками/сотнями можно где-то так:
потом сложение двух чисел — ну это просто конкатенация, потом переводить строку обратно в число.
Возни много.
sed 's/.*/echo $((&))/e' <<<"2+2"
Настоящий калькулятор на sed гораздо сложнее. Один подход (я тут быстро нагуглил, не сам придумал) — это сперва серией подстановок превратить число в строку одинаковых символов:
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#/; ну и так далее
потом сложение двух чисел — ну это просто конкатенация, потом переводить строку обратно в число.
Возни много.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Нескучный однострочный калькулятор на sed