Подтвердить что ты не робот

Boolean OR в sed regex

Я пытаюсь заменить все ссылки пакета с именем boots в файле конфигурации.

Формат линии add fast (package OR pkg) boots-(any-other-text), например:

add fast package boots-2.3
add fast pkg boots-4.5

Я хочу заменить его:

add fast pkg boots-5.0

Я пробовал следующие команды sed:

sed -e 's/add fast (pkg\|package) boots-.*/add yinst pkg boots-5.0/g'
sed -e 's/add fast [pkg\|package] boots-.*/add yinst pkg boots-5.0/g'

Какое правильное регулярное выражение? Я думаю, что я пропускаю что-то в логической или (package или pkg) части.

4b9b3361

Ответ 1

sed -e 's/add fast \(pkg\|package\) boots-.*/add yinst pkg boots-5.0/g'

Вы всегда можете избежать OR, сделав это дважды

sed 's/add fast pkg boots-.*/add yinst pkg boots-5.0/g
s/add fast package boots-.*/add yinst pkg boots-5.0/g'

Ответ 2

Используйте расширенный режим регулярного выражения и не выходите из |.

sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g'

Ответ 3

Вы смешиваете BRE и ERE, либо избегаете как (), так и | или none.

sed по умолчанию использует основные регулярные выражения, что позволяет использовать расширенные регулярные выражения, зависит от реализации, например. с BSD sed вы используете переключатель -E, GNU sed документируется как -r, но -E работает также.

Ответ 4

GNU (Linux):

1) Сделайте следующие случайные строки

   cidr="192.168.1.12"
   cidr="192.168.1.12/32"
   cidr="192.168.1.12,8.8.8.8"

в пустой

2) sed с -r для использования логических операторов в GNU, таких как @Thor, и -i на лету редактировать файл по найденному совпадению

$ echo '<user id="1000" cidr="192.168.1.12">' > /tmp/1000.xml
$ sed -r -i \ 
  s/'cidr="192.168.1.12\/32"|cidr="192.168.1.12"|192.168.1.12,'/''/ /tmp/1000.xml

-r = GNU sed
-i = search / match/ edit the changes to the file on the fly