拥有以下文本文件,我需要提取并打印两个模式之间的字符串,并包括第一个模式上方的行和第二个模式下方的行。
asdgs sdagasdg sdagdsag
asdfgsdagg gsfagsaf
asdfsdaf dsafsdfdsfas
asdfdasfadf
nnnn nnnnn aaaaa
line before first pattern
***** FIRST *****
dddd ffff cccc
wwww rrrrrrrr xxxx
***** SECOND *****
line after second pattern
asdfgsdagg gsfagsaf
asdfsdaf dsafsdfdsfas
asdfdasfadf
nnnn nnnnn aaaaa
我已经找到了许多用sed和awk提取两个标签之间内容的解决方案,如下所示
sed -n '/FIRST/,/SECOND/p' FileName
但是如何包含模式前后的行?
期望输出:
line before first pattern
***** FIRST *****
dddd ffff cccc
wwww rrrrrrrr xxxx
***** SECOND *****
line after second pattern
ed
中很简单,因为ed
的寻址比sed
更先进:printf '%s\n' "/FIRST/-;/SECOND/+p" q | ed -s FileName
。如果你想保存那一部分:printf '%s\n' "/FIRST/-;/SECOND/+w NewFileName" q | ed -s FileName
。 - gniourf_gniourf/FIRST/,/SECOND/
),因为它们使得微不足道的事情变得稍微简洁一些,但是当问题变得稍微有点有趣时,就需要完全重写和/或重复条件,正如您现在正在发现的那样。始终使用“found”标志,'/FIRST/{f=1} f; /SECOND/{f=0}
(哦,顺便说一下,对于这个和涉及多行的任何其他事情,请使用awk而不是sed)。 - Ed Morton