0

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

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record
SF:/home/developer/project/src/resources/otherfile.js
DA:9,2
DA:15,2
DA:22,2
end_of_record

...some more SF:/home/xxx and end_of_record lines...

该文件由以 . 开头SF: ...和结尾的块组成end_of_record。请注意,( DA:x,x) 之间的行数可以不同。我想打印第一行中包含字符串“test”的所有块(如此处的“SF:/home/developer/ test /resources/...”)。对于这个例子,我想要的输出是:

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record

我想在Linux环境中执行此操作。

我的第一次尝试是使用“sed”命令来执行此操作,但经过一些研究后,似乎“awk”是执行多行操作的更合适的工具。

使用 awk 和 Regex,这是我到目前为止的命令:

awk '/SF[:\/a-zA-Z0-9]*test[\/A-Za-z0-9.,:\n]*end_of_record/ {print}' FS="\n" RS="" examplefile

但它输出的是完整的examplefile,而不仅仅是第一行中包含“test”的块。我不确定我的正则表达式是否错误,或者我的awk通话中是否遗漏了某些内容。

我怎样才能只得到第一行带有“test”的块?

4

2 回答 2

3

你需要一个标志:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile
于 2012-09-12T14:30:59.360 回答
1
awk '{if($0~/SF:.*\/test\//){P=1;}if($0~/end_of_record/&& P==1){print;P=0;}if(P==1)print}' your_file
于 2012-09-12T13:48:20.563 回答