Как стать автором
Обновить

Комментарии 26

На десерт всем домоSEDам сообщу, существует в природе еще такая утилита Super-sed. В репозитории debian-testing имеет название пакета ssed. Это потоковый редактор способный понимать перловские регулярные выражения.

ssed это же вроде форк третьего gnu sed, а в моем дистрибутиве gnu sed уже 4 версии. Какие PCRE в нем не поддерживаются можете пример привести? Речь ведь про sed -r?
Вот с чем сама сталкивалась. Можете посмотреть на разницу в выводах двух команд.
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:]].

Спасибо. Было интересно.
Благодарю за оценку. Это моя первая публикация и у меня если честно до сих пор руки русятся.
У меня тоже самое было :) Вы явно добились успеха своей первой публикацией.
Спасибо за краткое введение, я как-то vim'ом больше пользуюсь, ибо там наглядно изменения происходят. И загляните, пожалуйста, в личку: там небольшие правки грамматики.
<teacher_mode_on> Если бы «Не забудка» читала Зощенко, а не слушала, то ошибок в тексте было бы поменьше, а запятых — побольше. <teacher_mode_off>
Можно и не заглядывать в vim. Как то так
vim +"%s/^/    /" +wq text.txt
НЛО прилетело и опубликовало эту надпись здесь
Прекрасная статья, отличный стиль! Следующим этап — переписать программу на С, используя flex и bison
Ценю хорошую шутку. Спасибо.
Это еще одна очень нескучная тема. с большим удовольствием прочла этот пост. пасьянс на bc. Если на калькуляторе делают игру, почему в редакторе не создать калькулятор?
А можно версию для прописывания в alias (e.g. /root/.bashrc)? :)
На мой взгляд для практического применения лючше питона, элаяса не придумаешь. Наберите в командной строке: python И работатайте точно так же только без буфера. Выход по команде exit(). Но если хотите быть последовательным, создайте файл например с именем 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 и проверить работоспособность калькулятора.
Вы правы, очень люблю этот оконный менеджер. Сейчас уже разрабатывается sway работающий в wayland. Советую обратить внимание на будущее.
Да, спасибо за совет. Искренне надеюсь, что не придётся никуда перебираться с i3wm — найти адекватный (для своих тараканов) оконный менеджер был тот ещё квест…

Блестяще и действительно не скучно. Я раньше дfже не подозревал что в sed есть модификатор /e

Я бы был очень рад, если бы в ближайшем будущем кто нибудь написал аналог программы Soulver для Linux.
Ну, вообще-то это калькулятор не на sed, а на bash. Тут sed просто разбивает строку на аргументы и вызывает, bash. Можно было бы и не разбивать (как, собственно, в конце статьи и делается):
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#/; ну и так далее

потом сложение двух чисел — ну это просто конкатенация, потом переводить строку обратно в число.
Возни много.
https://se.ifmo.ru/~korg/regexp/5.html
Задание 3, $ cat sed6…
Работает.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории