我正在尝试替换配置文件中名为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
)部分遗漏了一些内容。
答案 0 :(得分:21)
sed -e 's/add fast \(pkg\|package\) boots-.*/add yinst pkg boots-5.0/g'
您可以通过两次
来避免ORsed '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 :(得分:17)
使用扩展的正则表达式模式,不要转义|
。
sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g'
答案 2 :(得分:7)
您正在混合BRE和ERE以及()
和|
或两者都没有。
sed默认使用基本正则表达式,因此使用扩展正则表达式取决于实现,例如,使用BSD sed你使用-E
开关,GNU sed将其记录为-r
,但-E
也可以。
答案 3 :(得分:0)
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使用-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