提取相同两行文本之间的多个文本实例

提取相同两行文本之间的多个文本实例

我的文件是 JSON 格式,如下所示:

name: Tom species: mouse name: Stu species: cat name: Carter species: Dog

我有一个长字符串文件,我只想从此列表中提取名称。所以期望的输出是这样的:

Tom Stu Carter

例如,我对 sed 进行了很多失败的尝试

cat alphabet | sed 's/^.*name: \(.*\) species*/\1/g'

输出:

Tom species: mouse name: Stu species: cat name: Carter : Dog

我有很多非常大的文件,我想用它来做这件事,所以如果有一种有效的方法来解决这个问题那就太好了

答案1

如果您的输入实际上是 JSON,那么应该使用 JSON 工具。

它的格式似乎适合 awk:

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") print $i}' file
Tom
Stu
Carter

这会查看i一行上的每个字段,从第二个字段开始。如果前一个字段是name:,则它将打印当前字段。

要将所有输出保留在一行上(没有尾随空白):

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") {printf "%s%s", f,$i; f=" "}; print""}' file
Tom Stu Carter

答案2

使用 GNU grep:

grep -Po 'name: \K[^ ]*' file | tr '\n' ' '

或使用 GNU sed:

sed -r 's/name: ([^ ]*) species: [^ ]*/\1/g' file

输出:

汤姆·斯图·卡特

相关内容