Таким образом, синтаксис регулярного выражения зависит от используемой вами версии sed.
Прежде всего, согласно спецификации POSIX, базовые регулярные выражения (BRE) не поддерживают чередование .Однако инструменты не обязательно следуют спецификации и, в частности, разные версии sed ведут себя по-разному.
Все приведенные ниже примеры обрабатывают этот файл:
$ cat sed-re-test.txt
OtherElement "user.name"
OnlyReplaceMe "user.name"
ApplicationUser "user.name"
GNU sed
Вариант GNU sed BRE поддерживает чередование, но метасимвол |
(вместе с (
и )
) должен быть экранирован с помощью \
.Если вы используете флаг -E
для включения расширенных регулярных выражений (ERE), то метасимволы не должны быть экранированы .
$ sed --version
sed (GNU sed) 4.4
<...SNIP...>
вариант GNU sed BRE (с экранированными метасимволами): WORKS
$ cat sed-re-test.txt | sed '/\(OtherElement\|ApplicationUser\)/!s/"user.name"/"user.name@abc.com"/g'
OtherElement "user.name"
OnlyReplaceMe "user.name@abc.com"
ApplicationUser "user.name"
GNU sed ERE (с метасимволами без экранирования): WORKS
$ cat sed-re-test.txt | sed -E '/(OtherElement|ApplicationUser)/!s/"user.name"/"user.name@abc.com"/g'
OtherElement "user.name"
OnlyReplaceMe "user.name@abc.com"
ApplicationUser "user.name"
BSD / MacOS sed
BSD sed не поддерживает чередование в режиме BRE.Вы должны использовать -E
, чтобы включить поддержку чередования.
Нет --version
флаг, поэтому для идентификации ОС необходимо сделать:
$ uname -s
OpenBSD
BSD sed BRE (с метасимволами с экранированием и без экранирования): НЕ РАБОТАЕТ
$ cat sed-re-test.txt | sed '/\(OtherElement\|ApplicationUser\)/! s/"user.name"/"user.name@abc.com"/'
OtherElement "user.name@abc.com"
OnlyReplaceMe "user.name@abc.com"
ApplicationUser "user.name@abc.com"
$ cat sed-re-test.txt | sed '/(OtherElement|ApplicationUser)/! s/"user.name"/"user.name@abc.com"/'
OtherElement "user.name@abc.com"
OnlyReplaceMe "user.name@abc.com"
ApplicationUser "user.name@abc.com"
BSD sed ERE (с метасимволами без экранирования): WORKS
$ cat sed-re-test.txt | sed -E '/(OtherElement|ApplicationUser)/! s/"user.name"/"user.name@abc.com"/'
OtherElement "user.name"
OnlyReplaceMe "user.name@abc.com"
ApplicationUser "user.name"