如何在匹配行后返回第一行?我意识到不同的正则表达式引擎各不相同我特别感兴趣的是grep
版本。
答案 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 $]