sed正则表达式中的布尔OR

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed正则表达式中的布尔OR相关的知识,希望对你有一定的参考价值。

我正在尝试在配置文件中替换名为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'

什么是正确的正则表达式?我想我在布尔或(packagepkg)部分缺少一些东西。

答案
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要么逃避()|,要么没有。

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 with -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

以上是关于sed正则表达式中的布尔OR的主要内容,如果未能解决你的问题,请参考以下文章

sed中的非贪婪(不情愿)正则表达式匹配?

否定字符类中的单引号

对于Linux正则表达式在sed awk 过滤中的深入浅出

在 sed 中使用反向引用正则表达式

python 正则表达式 re模块基础

shell中的SED与正则式(帮我做下这些题目,谢谢)