26

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

行格式为add fast (package OR pkg) boots-(any-other-text),例如:

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

4 回答 4

32
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'
于 2013-02-11T13:45:33.173 回答
26

使用扩展正则表达式模式,不要转义|.

sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g'
于 2013-02-11T13:46:07.363 回答
8

你正在混合 BRE 和 ERE 要么都逃逸()|要么都不逃逸。

sed 默认使用基本正则表达式,启用扩展正则表达式的使用取决于实现,例如,使用 BSD sed 您使用-E开关,GNU sed 将其记录为-r,但-E也可以使用。

于 2013-02-11T13:44:40.267 回答
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) 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
于 2013-10-05T04:31:15.053 回答