在sed正则表达式中使用布尔运算OR

34

我正在尝试替换配置文件中名为boots的软件包的所有引用。

行的格式是add fast (package OR pkg) boots-(任何其他文本),例如:

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

我想用以下内容替换它:

add yinst 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'

什么是正确的正则表达式?我认为在逻辑或 (packagepkg) 部分中漏掉了某些内容。

4个回答

41
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'

4
在“twice”命令中使用半角分号更好。像这样:sed 's/\.ism/\.ism\.md5/g;s/\.usp/\.usp\.md5/g' /tmp/verify - Evgenii Iablokov
@EvgeniyYablokov 有什么特别的原因吗?也许在短暂的一次性脚本(像这个)中你可能是对的,但我仍然认为两行版本更容易阅读。 - bobbogo
我在Windows上使用GNU工具版本,按@EvgeniyYablokov建议使用分号才能正常工作。 - dgo

35

使用扩展正则模式,并且不要转义|

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

2
sed:无效选项--E。在Red Hat上似乎无法使用GNU sed版本4.1.5。 - Adam Matan
2
@AdamMatan 啊,使用GNU sed的-r标志,就像Thor所指示的那样。 - Spencer Rathbun
在macOS上,我使用sed -e -E出现了“sed: 1: "-E": invalid command code”的错误。切换参数后,它正常工作:sed -E -e - Walery Strauch
安装gnu-sed并检查版本号:brew install gnu-sed && gsed --version...但不要替换整个系统,因为依赖于MacOS具有“稳定”Shell环境的程序可能会出现问题...此外,您的更改通常会在每次小更新时被删除。 - Ray Foss

9
你混淆了基本正则表达式(BRE)和扩展正则表达式(ERE),应该同时转义或不转义括号()和竖线|
默认情况下,sed使用基本正则表达式。启用扩展正则表达式取决于实现,例如在BSD sed中,您需要使用-E开关,而GNU sed将其记录为-r,但-E也可以使用。

1

GNU(Linux):

1)生成以下随机字符串

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

转换为空

2)使用带有-r的sed,以便在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接