在另一个图案上查找最近的图案行并显示行号

在另一个图案上查找最近的图案行并显示行号

我有一个很长的 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

相关内容