我有一个多行文件:
line1
line2
line3
line_before
line4
line5
line6
和3种模式:
line2
line4
line6
:
line2
line_before
line4
line6
我尝试使用grep -B 1
,但它在任何模式之前显示行。
谢谢你的帮助!
With awk…
在我的例子中,你的多行文件被命名为"file.txt
";有3个图案的文件为filem.txt
。
awkfilter.awk
程序:
#! /bin/awk -f
NR == FNR && NR != 2 {
# First file: Save 1st en 3rd tokens
m[$0]=1
next
}
NR == FNR && NR == 2 {
# First file: Save 2nd token
b[$0]=1
next
}
NR != FNR {
# Second file
# Search line in tokens
for (e in m) {
if ($0 == e) {
# Print current line
print
old = $0
next
}
}
for (e in b) {
if ($0 == e) {
# Print previous line
if (FNR > 1) print prev
# Print current line
print
old = $0
next
}
}
}
{
# Save current line
prev = $0
}
像这样执行(文件顺序很重要):
awk -f filter.awk filem.txt file.txt
输出:
line2
line_before
line4
line6
我假设你想要只-B1
-e line4
。(我将其表述为:">我如何搜索多个模式,包括只有一个模式之前的行?")
关于grep -zPo
的建议:
grep -zPo 'vK(line[26]|V*vline4)(?=v)' file
或(相同的正则表达式,不同的语法):
grep -zPo '(?<=v)(line[26]|V*vline4)(?=v)' file
都输出如下:
line2
line_before
line4
line6
解释:
-z
:占用整个文件-o
:只输出匹配的字符串(一次一行)v
:垂直空白字符vK
或(?<=v)
:在匹配前需要垂直空白,但不包括在match 中(?=v)
:匹配后需要垂直空白,但不包括在匹配V*vline4
:对于line4
模式,包括前面的行(所有非垂直空白字符,换行符,然后匹配行)来模拟grep -B1 line4
-P
支持perl正则表达式