【问题标题】:How do I remove lines with grep based on conditions?如何根据条件使用 grep 删除行?
【发布时间】:2015-09-16 21:02:47
【问题描述】:

我想使用 grep 删除文件中以 ]: 结尾的所有行,以便下一行以 I 开头或到达 EOF。

即:删除所有以]:结尾的行并且后跟以I开头的行。

鉴于以下情况:

I am an invalid line ]:
I am a valid line ]:
some text
some text
some text
I am a valid line ]:
some text
I am an invalid line ]:
I am a valid line ]:
some text
some text
some text

输出应该是

I am a valid line ]:
some text
some text
some text
I am a valid line ]:
some text
I am a valid line ]:
some text
some text
some text

请注意,第 1 行和第 8 行 I am in invalid line ]: 已被删除,因为它以 ]: 结尾,而下一行以 I 开头

【问题讨论】:

  • 为什么some text 有效,如果有效行中只有I:]NOT invalid
  • 我已经更新了问题

标签: linux bash ubuntu grep


【解决方案1】:

这个 awk 应该可以满足您的要求:

awk '/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1' file

输出:

I am a valid line ]:
some text
some text
some text
I am a valid line ]:
some text
I am a valid line ]:
some text
some text
some text

分手:

/\]:$/{pno=NR;prec=$0;next}  # if ]: is at line end store line # and line and move to next
pno && !(/^I/ && NR==pno+1)  # if next row starts with I and we have prev vars set
{print prec; pno=0}          # print previous line and rest prev line # to 0
1                            # default action to print current record

【讨论】:

    【解决方案2】:
    grep -v 'invalid' file.txt
    

    应该这样做。使用 -v 您要求选择不符合该条件的行。

    例子:

    $ cat ~/test.txt
    I am an invalid line ]:
    I am a valid line ]:
    some text
    some text
    some text
    I am a valid line ]:
    some text
    I am an invalid line ]:
    I am a valid line ]:
    some text
    some text
    some text
    
    $ grep -v 'invalid' ~/test.txt
    I am a valid line ]:
    some text
    some text
    some text
    I am a valid line ]:
    some text
    I am a valid line ]:
    some text
    some text
    some text
    

    根据问题的变化进行更新

    sed ':a;N;$!ba;s/]:\nI/]:xxx\nI/g' ~/test.txt | grep -v 'xxx'
    

    使用这种方法,我将]:\nI 替换为]:xxx\nI。看看我是如何在以]:-newline-I 结尾的行后面注入 xxx 的?然后我 grep 并删除那些有 xxx

    【讨论】:

    • 我更新了问题。格式可能会改变。字符]:和我开头的标题不会改变。
    • 您能否用不同格式和所需输出的示例更新您的问题?完成后,请添加评论,我会更新我的答案
    • @Bobo。我懂了!我想我现在明白了这个问题,但我不知道如何使用后向正则表达式来做到这一点。希望擅长正则表达式的人会帮助回答
    • @Bobo 我添加了一个使用 sed 和 grep 的示例,它也可能对您有所帮助
    【解决方案3】:

    所有其他答案对我来说似乎都是多余的,所以也许我遗漏了一些东西,但是:

    sed 'N;/]:\nI/D'
    

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 2018-03-03
      • 2011-11-30
      • 2021-12-28
      • 2018-01-21
      • 2017-05-09
      相关资源
      最近更新 更多