2013-02-11 117 views
11

我试图在配置文件中替换所有名为boots的包的引用。布尔OR在sed正则表达式

该行格式为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' 

什么正确的正则表达式?我想我在布尔值或(packagepkg)部分丢失了一些东西。

回答

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

你总是可以避开或做两次

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' 
+1

在“两次”命令中使用分号更好。像这样:'sed's/\。ism/\ .ism \ .md5/g; s/\。usp/\。usp \ .md5/g'/ tmp/verify' – 2015-11-29 06:04:38

+0

@EvgeniyYablokov任何特定的原因?也许简而言之,一次性脚本(比如这个)可能有一点,但我仍然认为双线版本更易于阅读。 – bobbogo 2015-11-30 14:57:19

+0

我正在使用Windows @上的GNU-utils版本,必须像@EvgeniyYablokov那样用分号建议它工作。 – user1167442 2016-12-17 12:12:48

7

您正在混合BRE和ERE,既可以跳过()也可以跳过|,也可以不跳过。

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

14

使用扩展的正则表达式模式,不逃避|

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

'sed:无效选项-E'。似乎无法在Red Hat上使用'GNU sed version 4.1.5'。 – 2013-02-11 13:52:45

+2

@AdamMatan对于GNU sed,使用'-r'标志,正如Thor所示。 – 2013-02-11 14:54:41

0

GNU(Linux)的:

1)使以下的随机串

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

与-r sed的用于使用逻辑运算符在GNU像@空白

2)托尔提到,并且-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