【问题标题】:Boolean OR in sed regexsed 正则表达式中的布尔 OR
【发布时间】:2013-02-11 13:37:04
【问题描述】:

我正在尝试替换配置文件中名为 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)部分遗漏了一些东西。

【问题讨论】:

    标签: regex sed logical-operators


    【解决方案1】:
    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'
    

    【讨论】:

    • “twice”命令最好使用分号。像这样:sed 's/\.ism/\.ism\.md5/g;s/\.usp/\.usp\.md5/g' /tmp/verify
    • @EvgeniyYablokov 有什么特别的原因吗?也许在简短的一次性脚本(比如这个)中你可能有一点,但我仍然认为两行版本更容易阅读。
    • 我在 Windows 上使用 GNU-utils 版本 @ 必须按照 @EvgeniyYablokov 建议的分号才能工作。
    【解决方案2】:

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

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

    【讨论】:

    • sed: invalid option -- E。似乎不适用于 Red Hat 上的 GNU sed version 4.1.5
    • @AdamMatan 啊,如 Thor 所示,为 GNU sed 使用 -r 标志。
    • 在 mac os 上,我使用 sed -e -E 得到了 sed: 1: "-E ": invalid command code -。切换参数效果很好:sed -E -e
    • brew install gnu-sed && gsed --version... 但不要为整个系统替换它,因为依赖于具有“稳定”外壳环境的 MacOS 的不良程序会破坏...您的更改通常也会被破坏小更新。
    【解决方案3】:

    您正在混合 BRE 和 ERE,要么同时转义 ()|,要么不转义。

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

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

        猜你喜欢
        • 2017-02-03
        • 2023-03-23
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        相关资源
        最近更新 更多