正则表达式:返回匹配行后的第一行

时间:2013-12-08 22:58:12

标签: regex grep

如何在匹配行后返回第一行?我意识到不同的正则表达式引擎各不相同我特别感兴趣的是grep版本。

5 个答案:

答案 0 :(得分:3)

使用grep有一种直接的方法。

grep -A1 'PATTERN' file

-A选项表示在匹配行后打印 NUM 行尾随上下文。

grep -A1 'PATTERN' file | grep -v 'PATTERN'

-v选项反转匹配感,以选择不匹配的行。如果您只想打印匹配模式后的行,则可以使用此选项。

答案 1 :(得分:1)

实际上,你可以通过两次grep调用很容易地做到这一点:

grep --no-group-separator -A1 pattern input.dat | grep -v pattern

但这有点难看,因为你必须输入两次模式,这可能容易出错。你可以用脚本包装它,但就个人而言,我倾向于使用sed来做这类事情。

无论如何,这是一个例子:

[lineafter.sed $] cat input.dat
aaa0
bbb0
ccc0
ddd0
eee0
fff0
ggg0
hhh0
aaa1
bbb1
ccc1
ddd1
eee1
fff1
ggg1
hhh1
[lineafter.sed $] grep --no-group-separator -A1  ccc input.dat | grep -v ccc
ddd0
ddd1
[mnoy@mn09 lineafter.sed $]

(请注意,如果你不使用--no-group-separator,你最终会使用 - 标记来分隔匹配的实例(可能是你想要的......))。

答案 2 :(得分:0)

使用sed

sed '/pattern/,+1!d' filename

答案 3 :(得分:0)

这只会在找到pattern后的下一行

awk 'f {print;f=0} /pattern/ {f=1}' file

例如

cat file
one
two
three
four

awk 'f {print;f=0} /two/ {f=1}' file
three

答案 4 :(得分:0)

我不知道如何用grep做这个,但是用sed非常容易:

sed -n '/pattern/{n;p}' input.dat 

示例:

[lineafter.sed $] cat input.dat
aaa0
bbb0
ccc0
ddd0
eee0
fff0
ggg0
hhh0
aaa1
bbb1
ccc1
ddd1
eee1
fff1
ggg1
hhh1
[lineafter.sed $]
[lineafter.sed $] sed -n '/ccc/{n;p}' input.dat
ddd0
ddd1
[lineafter.sed $]