打印文本文件中的行按bash中的模式拆分为多个部分

时间:2018-01-23 19:46:40

标签: bash design-patterns awk sed split

我有一个这样的文本文件:

line 1  
line 2
* 
line 3
* 
line 4 
line 5 
line 6
*
line 7
line 8

我想写出两种模式之间的部分(在这种情况下为*)。所以如果我想要第一部分,我想得到

line 1
line 2

如果我想获得第三个,它应该是

line 4
line 5
line 6

返回的行应该没有星号,重要的是开头或结尾没有星号。 我正在考虑将整个文本“拆分”为使用'*'作为带有sed或awk的分隔符的列,但我没有成功。有人可以帮忙吗?非常感谢。

这就是我的尝试:

sed "/^%/{x;s/^/X/;/^X\\{$choice\\}$/ba;x};d;:a;x;:b;$!{n;/^%/!b‌​b}" "$file"

但这需要在开头有一个*,它还会打印前后的星号。

2 个答案:

答案 0 :(得分:1)

$ awk -v num=3 '$0=="*"{ if (++count >= num) exit; next } num-1==count' data
line 4
line 5
line 6
$ awk -v num=1 '$0=="*"{ if (++count >= num) exit; next } num-1==count' data
line 1
line 2

答案 1 :(得分:1)

awk救援

$ awk -v RS='\n\\*\n' -v n=3 'NR==n' file
line 4
line 5
line 6

这需要多字符记录分隔符支持(gawk)。

另一种选择,计算星星

$ awk -v n=3 '/^*/{c++;next} c==n-1' file
line 4
line 5
line 6