LINUX.ORG.RU

[sed] Заменить несколько подстрок одним выражением

 


0

2

Привет.

Подскажите, как заменить несколько подстрок одним выражением?

Или одним нельзя, только через несколько пайпов пропускать?

Спасибо.

★★

Последнее исправление: Frakhtan-teh (всего исправлений: 3)

sed -r 's/(regex1|regex2|regex3)/sub/'

PS:

sed -e 'regexp1' -e 'regexp2' -e 'regexp3' ...

это что значит? выполнение трёх sed-скриптов? Причём тут это?

drBatty ★★
()
Ответ на: комментарий от drBatty

> это что значит? выполнение трёх sed-скриптов? Причём тут это?

Классический способ, к тому же портабельный:

$ echo regex2 | sed -e 's/regex1/sub/' -e 's/regex2/sub/' -e 's/regex2/sub/'   
sub

В отличии от:

$ echo regex2 | sed -r 's/(regex1|regex2|regex3)/sub/' 
sed: illegal option -- r
bigbit ★★★★★
()
Ответ на: комментарий от bigbit

тогда уж

sed 's/regex1/sub/;s/regex2/sub/;s/regex2/sub/'

Если у вас не GnuSed, вы можете использовать обычные RE вместо расширенных

sed 's/\(regex1\|regex2\|regex3\)/sub/'

Я использовал расширенные лишь для большей наглядности (sed-скрипты и так страшные).

ЗЫЖ У вас виндовс или BSD? ;)

drBatty ★★
()
Ответ на: комментарий от bigbit

PPS: конструкция «найти А заменить на Х, потом найти Б, заменить на Х, потом найти В, и заменить на Х» не является «классической». Куда как логичнее конструкция «искать А или Б или В, и поменять найденное на Х». И работает такое в разы быстрее.

drBatty ★★
()
Ответ на: комментарий от drBatty
sed 's/regex1/sub/;s/regex2/sub/;s/regex2/sub/'

Тоже вариант, но лично мне больше нравится с несколькими опциями "-e", т.к. каждый regex можно разместить на отдельной строке, что читается лучше, чем одна длинная строка.

Если у вас не GnuSed, вы можете использовать обычные RE вместо расширенных

sed 's/\(regex1\|regex2\|regex3\)/sub/'

Непереносимо. Например, в Solaris и AIX не работает.
Зато первый способ работает везде. Потому и люблю, за универсальность =)

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

Тоже вариант, но лично мне больше нравится с несколькими опциями "-e", т.к. каждый regex можно разместить на отдельной строке, что читается лучше, чем одна длинная строка.

sed '
s/regex1/sub/
s/regex2/sub/
s/regex2/sub/
'

:)

Правда длинные строчки в shell набирать/редактировать неудобно. Но я и не люблю длинные одностроки - их я сворачиваю в sed-скрипты. Ваш вариант тоже неудобно редактировать (на практике там обычно совсем не одна команда s).

Непереносимо. Например, в Solaris и AIX не работает.

Зато первый способ работает везде. Потому и люблю, за универсальность

Вообще-то это уже POSIX.2 (если верить моему man 7 regex). Если солярка и AIX не POSIX-совместимые... Моё счастье, что мне не попадались сервера под этими системами. Спасибо, учту на будущее.

В любом случае, если --regexp-extended действительно непереносимое GNU расширение, то уж суб-выражения, и альтернативы \(\|\) вполне переносимы ИМХО.

drBatty ★★
()
Ответ на: комментарий от GotF

>> Непереносимо. Например, в Solaris и AIX не работает.

ERE есть в POSIX.


И что? Думаешь, в POSIX написано, что sed должен уметь ERE?

grep в Solaris и AIX кстати умеет ERE.
А вот sed поддерживает только basic RE.

bigbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.