我有一个很长的 XML 文件,其中有一些重复的部分。我想找到字符串 B 在字符串 A 上最接近出现的行号。假设我有很多实例:
<section>
...
<entry>
<key>key-im-looking-for</key>
...
</entry>
...
<type>org.apache.whatever.package</type>
...
</section>
我想找到包含的行号
key-im-looking-for
<type>org.apache.whatever.package</type>
使用 grep、awk 或 sed 与搜索词最接近(或包含在同一部分中) 。
答案1
首先,我觉得在 XML 中查找行号有点奇怪。 XML 是树形结构,其中空格是不相关的,因此行号也应该是不相关的。这让我想知道这是否是一个XY问题。
其次,如果我忽略行号问题,通常最好使用适当的 XML 解析器,或者可以执行 XPATH 查询的东西。就 XML 而言,您的问题接近于“类型为 X 的节点的键是什么”。在使用 XML 时,这是一个合理的、定义明确的问题。
话虽这么说,如果“最近的”<key>
总是出现在 之前<type>
,那么您可以在 awk 中考虑此算法:
- 如果行匹配
<key>key-im-looking-for<
,记录行号 - 如果该行匹配
<type>org.apache.whatever.package<
,则停止处理 - 最后打印记录的行号
像这样的东西:
awk '/<key>key-im-looking-for</ { line=NR }
/<type>org.apache.whatever.package</ { exit }
END { print line }' input.xml
答案2
使用以下命令应该可以做到这一点:
cat -n sample.xml | grep key-im-looking-for
# or
grep -n key-im-looking-for sample.xml