使用tac 以另一种方式打印文件,然后使用grep -m1 仅打印一个结果。向后看和向前看会检查 <tag> 和 </tag> 之间的文本。
tac a | grep -m1 -oP '(?<=tag>).*(?=</tag>)'
测试
鉴于此文件
$ cat a
<tag> and </tag>
aaa <tag> and <b> other things </tag>
adsaad <tag>and last one</tag>
$ tac a | grep -m1 -oP '(?<=tag>).*(?=</tag>)'
and last one
更新
编辑:搜索参数 和 包含在不同的行中
大约 100 行内容将它们分开。内容就是我
之后……
那就有点棘手了:
tac file | awk '/<\/tag>/ {p=1; split($0, a, "</tag>"); $0=a[1]};
/<tag>/ {p=0; split($0, a, "<tag>"); $0=a[2]; print; exit};
p' | tac
这个想法是反转文件并使用标志p 来检查<tag> 是否已经出现。它将在</tag> 出现时开始打印,并在<tag> 出现时完成(因为我们正在反向读取)。
-
split($0, a, "</tag>"); $0=a[1]; 获取</tag> 之前的数据
-
split($0, a, "<tag>" ); $0=a[2];获取<tag>之后的数据
测试
给定一个像这样的文件a:
<tag> and </tag>
aaa <tag> and <b> other thing
come here
and here </tag>
some text<tag>tag is starting here
blabla
and ends here</tag>
输出将是:
$ tac a | awk '/<\/tag>/ {p=1; split($0, a, "</tag>"); $0=a[1]}; /<tag>/ {p=0; split($0, a, "<tag>"); $0=a[2]; print; exit}; p' | tac
tag is starting here
blabla
and ends here