awk捕获两个模式之间重复的线组

时间:2019-04-03 21:30:11

标签: bash awk

我有一个文本文件,例如:

$ cat test.txt
one
two
--------------
three
four
--------------
five
six
--------------
seven
eight
--------------
nine
ten

我正在尝试使用awk来捕获--------------两行之间的文本。

我正在尝试的输出:

$ cat test.txt
three
four

seven
eight

这是我到目前为止所拥有的

awk '/^--------------$/{flag=1;next}/^--------------$/{flag=0}flag' test.txt
three
four
five
six
seven
eight
nine
ten

3 个答案:

答案 0 :(得分:1)

$ awk -v RS='\n-+' '!(NR%2)' file

three
four

seven
eight

需要多字符RS支持(gawk)。它定义了记录分隔符,因此在分隔符之间进行记录。在这里,我们要求打印偶数记录。

或者,

$ awk '/^-+$/{f=!f; if(f) print ""; next} f' file

three
four

seven
eight

这类似于您的解决方案,在每次出现图案时翻转标志,并在设置标志时打印。在分隔组之前添加一个空行。

答案 1 :(得分:1)

$ awk '{x=sub(/^-+$/,"")} f; x{f=!f}' file
three
four

seven
eight

sub()用空格替换所有---行,并保存它在x中这样做的事实,以记住当前行是---行。 x(f=!f}f行的---在0和1之间切换。由于f;是给定真实条件的默认操作,因此f为true时,{print}打印当前行。

答案 2 :(得分:0)

您可以这样作弊:

sed 's/^-\{14\}//' file