【问题标题】:Rgex doen't work with sed command as expected正则表达式无法按预期与 sed 命令一起使用
【发布时间】:2021-11-28 14:16:32
【问题描述】:

我有一个文本文件,其中包含:

A 25 27 50

B 35 75

C 75 78

D 99 88 76

我想删除没有第四个字段(第四对数字)的行。 预期输出:

A 25 27 50

D 99 88 76

我知道 awk 命令将是此类任务的最佳选择,但我想知道我的 sed 命令有什么问题,因为它应该可以正常工作见下文:

sed -E '/^[ABCD] ([0-9][0-9]) \1$/d' text.txt

使用带有反向引用 (\1) 的 POSIX ERE 来引用用括号括起来的前一个模式。

我已经尝试过这个命令:

sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt

但它似乎只删除了我想要的第一次出现。 我将不胜感激,

  • 为什么反向引用不能按预期工作。
  • 在第二次尝试中第一次出现是怎么回事,如果是的话,我应该包括全局选项然后如何,因为我已经尝试将它与 /d 一起添加到末尾(用于删除)但它没有用。

【问题讨论】:

    标签: regex linux shell sed


    【解决方案1】:

    awk 更容易:

    awk 'NF == 4' file
    
    A 25 27 50
    D 99 88 76
    

    awk 命令使用空格或制表符的默认字段分隔符并检查条件NF == 4 以确保我们仅打印包含 4 个字段的行。


    使用sed 将是(假设每行中没有前导+尾随空格):

    sed -nE '/^[^[:blank:]]+([[:blank:]]+[^[:blank:]]+){3}$/p' file
    
    A 25 27 50
    D 99 88 76
    

    【讨论】:

    • @Ayoub_Prog:成功了吗?
    【解决方案2】:

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

    sed -En 's/\S+/&/4p' file
    

    关闭隐式打印 -n 和扩展正则表达式 -E

    用它自己替换第 4 个字段并打印结果。

    【讨论】:

      【解决方案3】:

      使用您在sed 程序中显示的示例,您可以尝试关注。用 GNU sed 编写和测试。

      sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file
      

      解释:只需通过sed-n 选项停止打印行。然后使用-E 在程序中使用 ERE。在主程序中使用正则表达式匹配从开始的非空格(1 次或多次出现)然后是空格(1 次或多次出现)和这个组合 3 次(基本上匹配 3 个字段),然后是非空格 1 次或多次出现直到行尾值,如果此正则表达式匹配,则打印该行。

      【讨论】:

        猜你喜欢
        • 2017-11-14
        • 1970-01-01
        • 2013-08-07
        • 2021-07-16
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2020-10-11
        相关资源
        最近更新 更多