一尘不染

awk:显示匹配的正则表达式(多行)

linux

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

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”的块?


阅读 621

收藏
2020-06-07

共1个答案

一尘不染

您需要一个标志:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile
2020-06-07