Ответ 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'
Я пытаюсь заменить все ссылки пакета с именем 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
) части.
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'
Используйте расширенный режим регулярного выражения и не выходите из |
.
sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g'
Вы смешиваете BRE и ERE, либо избегаете как ()
, так и |
или none.
sed по умолчанию использует основные регулярные выражения, что позволяет использовать расширенные регулярные выражения, зависит от реализации, например. с BSD sed вы используете переключатель -E
, GNU sed документируется как -r
, но -E
работает также.
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