【问题标题】:search htm files for pair of words between BR tags在 htm 文件中搜索 BR 标签之间的单词对
【发布时间】:2022-01-28 20:28:31
【问题描述】:

我有 500 多个文件的集合,其中包含许多用于分隔数据元素的
标签。

例如,file001.htm 包含:

<br \/>J Smith<br \/>B Jones<br \/>john smith betty Jones<br \/>Henry Peterson<br \/>jones Smith<br \/>

对于单个文件;此命令将查找同时具有“Smith”和“Jones”的数据元素(忽略大小写和顺序):

sed 's/<br \/>/\n/g' file001.htm | grep -i Smith | grep -i Jones

生产:
john smith betty Jones
jones Smith

但是当我将 file001.htm 更改为 file*.htm;我得到了很多匹配项,但我不知道哪个文件包含这些匹配项。

我想要一个命令行解决方案,它可以按任意顺序在所有文件中搜索
标记之间的两个单词,并且输出会告诉我哪些文件包含匹配的数据。

【问题讨论】:

  • 您正在尝试做的事情,在像 HTML 这样的结构化数据文件中查找字符串,这不是您可以使用正则表达式可靠地完成的事情。您应该在您选择的编程语言中使用适当的 HTML 解析器。
  • 您的 sed 脚本没有产生您所说的输出,请检查一下。
  • 使用正则表达式解析html会引起长辈的愤怒。 stackoverflow.com/a/1732454/1216776

标签: linux sed command-line grep html-parsing


【解决方案1】:

如果您的输入确实像您显示的那样常规,这将满足您的要求,使用 GNU awk 处理多字符 RSIGNORECASE

$ awk -v RS='<br [\\\\]/>' -v OFS=': ' -v IGNORECASE=1 '
    /smith/ && /jones/ { print FILENAME, $0 }
' file*.htm
file001.htm: john smith betty Jones
file001.htm: jones Smith

请注意,正如您在 sed 脚本中所写并在上面复制的 smith 匹配 smithereens 等。如果这是一个问题,那么如果您的目标字符串都是单词组成,您可以添加单词边界以避免此类部分匹配问题字符:

$ awk -v RS='<br [\\\\]/>' -v OFS=': ' -v IGNORECASE=1 '
    /\<smith\>/ && /\<jones\>/ { print FILENAME, $0 }
' file*.htm
file001.htm: john smith betty Jones
file001.htm: jones Smith

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多