Существует много вариантов синтаксиса регулярных выражений . Самые первые инструменты в мире Unix, которые имели регулярные выражения, не имели полных возможностей регулярных выражений, только наборы символов ( […]
и .
), repetition ( *
) и якоря строк ( ^
и $
). Базовые регулярные выражения имеют только эти операторы. Sed является инструментом старой школы и использует базовые регулярные выражения.
Многие реализации sed имеют расширения для полного соответствия регулярному выражению. Поскольку персонаж |
выступает за себя, его нужно использовать \|
для чередования, а так же \(
и \)
для группировки. Обратите внимание, что стандарт POSIX не \|
требует поддержки в основных регулярных выражениях , а в некоторых системах (например, OpenBSD ) его нет.
В некоторых версиях sed есть возможность переключаться на расширенные регулярные выражения , где (…)
используется для группировки и |
чередования. С GNU sed (т.е. под Linux или Cygwin) или Busybox , передайте -r
опцию. На FreeBSD или OSX передайте -E
опцию.
Если у вашего sed нет чередования, вы можете awk
вместо этого позвонить . Это предписано POSIX , но немного многословно для этой задачи, и оно не поддерживает обратные ссылки.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
Кстати, только GNU и Busybox sed поддерживают замену файлов на месте. Awk и другие версии sed этого не делают. См. Можно ли сделать `cut` для изменения файла на месте?
Если у вас есть Perl, он часто удобен для обработки текста одним способом. Большая часть того, что легко в sed, awk и остальном, не намного сложнее в Perl, и вы можете получить удовольствие от изучения одного (если сложного) инструмента.
perl -i -pe 's/foo|bar/narf/g' fileName