bash - 如何使用 bash 在仅模式之前过滤多个模式和一行?
问题描述
我有一个包含多行的文件:
line1
line2
line3
line_before
line4
line5
line6
和 3 种模式:
line2
line4
line6
预计:
line2
line_before
line4
line6
我尝试使用grep -B 1
,但它在任何模式之前显示线条。
感谢您的任何帮助!
解决方案
我假设你 -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\K
or(?<=\v)
:在匹配之前需要垂直空格,但不要在匹配中包含它(?=\v)
: 匹配后需要垂直空格,但不要在匹配中包含它\V*\vline4
:对于line4
模式,包括前面的行(所有非垂直空白字符、换行符,然后是匹配行——以模仿grep -B1 line4
推荐阅读
- flutter - Flutter Doctor - 无法确定捆绑的 Java 版本
- r - 使用不同的列名合并两个数据集:left_Join
- node.js - 如何使用 Node.js 上的 https 模块连接客户端证书
- oracle - 如何从 Datagrip 更改 Oracle 密码?
- sas - 先说SAS怎么用。与 NOTSORTED
- visual-studio - 项目的 Visual Studio 自定义起始页
- c# - 'await' 之后的代码可以在 ASP.NET 的不同线程中运行吗?
- python - 要求用户输入某些信息
- mysql - MySql插入多个并忽略重复记录
- r - 多序列比对 R