![提取相同两行文本之间的多个文本实例](https://linux22.com/image/94143/%E6%8F%90%E5%8F%96%E7%9B%B8%E5%90%8C%E4%B8%A4%E8%A1%8C%E6%96%87%E6%9C%AC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E6%9C%AC%E5%AE%9E%E4%BE%8B.png)
我的文件是 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
输出:
汤姆·斯图·卡特