【问题标题】:sed can't match 0 or 1 timesed 不能匹配 0 或 1 次
【发布时间】:2017-11-02 02:28:00
【问题描述】:

我正在 Cent OS7 上编写一个 bash 脚本。现在我需要使用sed 删除所有不包含.jpg.jpeg 的行。

这是我的脚本:

sed -i -e '/\.jp(e)?g/!d' myfile

但它会删除所有行,这意味着它不能按预期工作。

但是,如果我这样做 sed -i -e '/\.jpg/!d' myfilesed -i -e '/\.jpeg/!d' myfile。两者都运作良好。

【问题讨论】:

    标签: bash shell sed


    【解决方案1】:

    捕获的组 (()) 和量词 ?(匹配前面的标记 0 或 1 次)(至少)带有 ERE(扩展正则表达式),而不是 BRE(基本正则表达式)。

    sed 默认使用 BRE,因此令牌按字面意思处理。

    要启用 ERE,请使用 -E(或 -r,如果可用)和 sed

    sed -E '/\.jp(e)?g/!d' myfile
    

    在这里捕获e 是多余的:

    sed -E '/\.jpe?g/!d' myfile
    

    请注意,您可以使用 BRE 中的 ERE 令牌,方法是使用 \ 转义它们,因此以下操作也可以:

    sed '/\.jp\(e\)\?g/!d' myfile
    sed '/\.jpe\?g/!d' myfile
    

    同样,这看起来不像只使用一个选项(即-E)那么干净。唯一需要的情况是便携性。

    【讨论】:

      【解决方案2】:

      sed 命令中使用正则表达式可能会满足您的要求,零个或一个“e”将被过滤,如下所示。

      sed -i -e '/jpe\?g/!d' myfile

      【讨论】:

        【解决方案3】:

        这可能对你有用(GNU sed):

        sed '/\.jp\(e\|\)g/!d' file
        

        在其中一个为空的情况下使用替代。

        也许更容易查看是否列出了替代品:

        sed '/\.jpeg\|\.jpg/!d' file
        

        不过,如前所述,请使用?

        sed '/\.jpe\?g/!d' file
        

        注意* 是零个或多个,即

        sed '/\.jpe*g/!d' file
        

        允许.jpeeeeeeeeeeeeeeeeg

        【讨论】:

          猜你喜欢
          • 2015-11-14
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 2018-09-08
          • 2018-04-30
          • 2014-06-18
          • 2013-09-30
          相关资源
          最近更新 更多