【问题标题】:Print lines from text file splitted into parts by a pattern in bash打印文本文件中的行,按 bash 中的模式拆分为多个部分
【发布时间】:2018-01-23 19:46:40
【问题描述】:

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

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

我想写出介于两种模式之间的部分(在本例中为 *)。所以如果我想要第一部分,我想得到 ​​p>

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"

但这需要在开头有一个 * 并且它还会在之前和之后打印星号。

【问题讨论】:

  • 目标是您添加一些自己的代码,以至少展示您为解决这个问题所做的研究工作。

标签: bash design-patterns awk sed split


【解决方案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

【讨论】:

  • 聪明!提前退出。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多