遍历文件并在模式之间操纵文本

时间:2019-01-14 16:17:01

标签: bash

我有一个看起来像这样的文件:

START
#Test
#Test
#Test
A    B    1
A    B    2
A    C    1
A    C    2
START
#Test
#Test
#Test
A    B    1
A    B    1
A    A    2
A    C    3
START

并继续进行多次。

我想做的是在bash中循环浏览文件,以便我可以操纵夹在“ START”之间的第一批文本,将其写入文件,然后移至下一批并执行相同的操作。依此类推。

编辑: 预期的输出很难发布,但是从本质上来说,我希望能够在每个“开始”之间编辑文本,因此输出将只是整个文本块,但一次打印一个块,因此我可以分别对每个块进行操作。

我尝试搜索答案,并遇到了共享的here代码,但就我认为仍然可以正常工作的情况而言,它不会以与输入相同的格式打印文本。

2 个答案:

答案 0 :(得分:0)

您可以在每行START的末尾添加NUL字节,然后使用split处理文件拆分:

 sed -E '/^START$/{N;s/\n/\n\x0/}' yourfile | split -t '\0' -l 1

使用示例输入,将生成3个文件xaa xab和xac,分别包含第一个START(为空),第二个开始和第三个开始之前的部分。可以使用split的选项将文件名更改为更合适的值。

sed命令比您想象的要复杂一些,因为您要将NUL字节放在换行符之后,这需要读取START行之后的行以使换行符在模式空间。

由于这个原因,当两个部分结束时,将不会处理两个连续的START行,而第二个START将成为下一部分的一部分。

See it in action !

答案 1 :(得分:0)

您可以为此使用awk。假设您输入的文件为 test.txt

START
#Test
#Test
#Test
A    B    1
A    B    2
A    C    1
A    C    2
START
#Test
#Test
#Test
A    B    1
A    B    1
A    A    2
A    C    3

我们会将这个文件作为awk的输入。

cat test.txt | awk 'BEGIN{ RS = "" ; FS = "START\n" }{print $2}'

此代码会将您的字符串分成批次。 RS 运算符将帮助您识别行, FS 将帮助您将 START 定义为分隔符。我不明白为什么第一个是空的。但是无论如何,您都可以将变量用作批号,从$ 2开始。

cat test.txt | awk 'BEGIN{ RS = "" ; FS = "START\n" }{print $2}'

#Test
#Test
#Test
A    B    1
A    B    2
A    C    1
A    C    2

cat test.txt | awk 'BEGIN{ RS = "" ; FS = "START\n" }{print $3}'

#Test
#Test
#Test
A    B    1
A    B    1
A    A    2
A    C    3