首页 > 解决方案 > 如何使用 bash 在仅模式之前过滤多个模式和一行?

问题描述

我有一个包含多行的文件:

line1
line2
line3
line_before
line4
line5
line6

和 3 种模式:

line2
line4
line6

预计:

line2
line_before
line4
line6

我尝试使用grep -B 1,但它在任何模式之前显示线条。

感谢您的任何帮助!

标签: bashawksedgrep

解决方案


我假设你 -B1 -e line4想要. (我会这样说:“我怎样才能 grep 多种模式,包括只有一个之前的行? ”)

建议grep -zPo

grep -zPo '\v\K(line[26]|\V*\vline4)(?=\v)' file

或(相同的正则表达式,不同的语法):

grep -zPo '(?<=\v)(line[26]|\V*\vline4)(?=\v)' file

两者都输出:

line2
line_before
line4
line6

解释:

  • -z: 消耗整个文件
  • -P支持 perl 正则表达式
  • -o: 只输出匹配的字符串(一次一行)
  • \v: 垂直空白字符
  • \v\Kor (?<=\v):在匹配之前需要垂直空格,但不要在匹配中包含它
  • (?=\v): 匹配后需要垂直空格,但不要在匹配中包含它
  • \V*\vline4:对于line4模式,包括前面的行(所有非垂直空白字符、换行符,然后是匹配行——以模仿grep -B1 line4

推荐阅读