我有一个看起来像这样的文件:
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
结尾的 block 组成。请注意,(DA:x,x
) 之间的行数可能不同。我想打印所有在第一行有字符串“test”的 block (比如这里的“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”的 block 。我不确定我的正则表达式是否有误,或者我是否在 awk
调用中遗漏了某些内容。
如何只获取第一行带有“test”的 block ?
最佳答案
你需要一面旗帜:
awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile
关于regex - awk:显示匹配的正则表达式(多行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389421/