【问题标题】:grep lines before with pattern "match and not match"grep 行之前带有模式“匹配和不匹配”
【发布时间】:2017-07-28 17:38:11
【问题描述】:

文件test.txt中有如下内容:

line 1  
foo bar  
line 2  
foo  

我需要返回包含foo但不包含bar的行之前的行

在示例中,结果必须是:

line 2  
foo

【问题讨论】:

    标签: awk grep


    【解决方案1】:
    grep -v bar fyle.txt | grep -B 1 foo
    

    在 foo 之前获取一行,但不使用 bar

    【讨论】:

      【解决方案2】:

      使用awk,很容易将正则表达式匹配与逻辑运算符结合起来:

      $ awk '/foo/ && !/bar/{printf "%s\n%s\n",last,$0}{last=$0}' file
      line 2  
      foo
      

      【讨论】:

        【解决方案3】:

        您可以使用“负前瞻”表达式(需要使用 grep 的命令行参数 -P 启用 perl 正则表达式)

        grep -P -B1 '(foo)(?!.*bar.*)' data.txt
        

        【讨论】:

        • 你还想看看后面,可变长度的环视并没有得到广泛的支持,因为它们非常昂贵。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 2015-04-02
        • 1970-01-01
        相关资源
        最近更新 更多