【问题标题】:sed regexp - extra unwanted line in matching outputsed regexp - 匹配输出中多余的多余行
【发布时间】:2021-12-01 05:03:49
【问题描述】:

我有这个文件

~/ % cat t
---
    abc
def DEF    
ghi GHI
---
123
456

我想提取三个破折号之间的内容,所以我尝试

sed -En '{N; /^---\s{5}\w+/,/^---/p}' t

即3 个破折号后跟 5 个空格,包括换行符,后跟一个或多个单词字符,并以另一组三个破折号结尾。这给了我这个输出

~/ % sed -En '{N; /^---\s{5}\w+/,/^---/p}' t
--- 
    abc
def DEF
ghi GHI
---
123

我不想要带有“123”的行。为什么我会这样,我该如何调整我的表情来摆脱它? [编辑]:在表达式中匹配前三个破折号后的四个缩进空格很重要。

【问题讨论】:

  • 您需要在输出中包含--- 行吗?还是没有必要?
  • 我不认为这是绝对必要的,尽管保留最后一个可能会很好,因为我需要一些分隔符来分割文件中的字符串。
  • 这些命令都不起作用。它们也都匹配最后三个破折号后的“123”和“456”行。

标签: regex sed


【解决方案1】:

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

sed -En '/^---/{:a;N;/^ {4}\S/M!D;/\n---/!ba;p}' file

打开扩展正则表达式 (-E) 并关闭隐式打印 (-n)。

如果一行以--- 开头并且下一行缩进了4 个空格,则收集以下行直到另一行以--- 开头并打印出来。

如果以下行不符合上述条件,则删除第一行并重复。

所有其他行将通过未打印。

注意用于多行匹配的第二个正则表达式上的 M 标志,因为第一行已经开始 --- 下一行必须缩进。

【讨论】:

    【解决方案2】:

    这里不需要使用模式空间 - 范围模式就可以了。

    $ sed -n '/^---/,/^---/p' t 
    ---
        abc
    def DEF    
    ghi GHI
    ---
    

    在 GNU sed 4.7 和 OSX sed 中测试。

    【讨论】:

    • 我很抱歉没有完全准确地描述我的对象。但表达式还必须匹配前三个破折号后第一行中的四个缩进空格。如果这些空格不存在,那么我不希望它匹配。
    【解决方案3】:

    相信你可以使用

    perl -0777 -ne '/^---\R(\s{4}\w.*?^---)/gsm && print "$1\n";' t
    

    详情

    • -0777 - 将文件放入单个变量中
    • ^---\R(\s{4}\w.*?^---) - 行首 (^),---,换行符,然后是第 1 组:四个空格,一个单词字符,然后是零个或更多字符,然后是 ---行首
    • gsm - global,返回所有匹配项,s 表示 . 匹配任何字符,包括换行符,因为 m 表示 ^ 现在匹配任何行的开头,而不仅仅是字符串开头李>
    • && print "$1\n" - 如果匹配,则打印第 1 组值 + 换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多