【问题标题】:grep command always includes html tag with matching outputgrep 命令始终包含具有匹配输出的 html 标记
【发布时间】:2015-04-11 08:21:02
【问题描述】:

这是一个奇怪的问题..

我有一个 html 标签之间的单词列表,每个单词由一行分隔,左侧有一些空格,如下所示:

    <td>word</td>
    <td>anotherWord</td>
    ...

我想从列表中提取单词而不是标签,所以我使用:

temp=$(printf "%s" "$temp" | egrep '[....]')

澄清一下,“temp”是要搜索的输入。 (我在 bash 脚本中执行此操作,并将输入存储在变量 temp 中)。 “...”是一个字符列表,因为我尝试提取的单词仅使用某些字符。

只要 grep 找到匹配项,它就会输出单词以及两边的 html 标签!这仅在匹配时发生,因为我通过将正则表达式参数设置为乱码进行了测试,例如“09680876” - 它在临时文件中没有匹配项,并且 grep 没有输出任何内容。

我还尝试使用我知道匹配的特定单词作为正则表达式参数,如下所示:

.... | egrep 'hanai')

我知道“hanai”在示例文本中是绝对匹配的。这导致 grep 输出

<td>hanai</td>

我完全被难住了,无法在线找到解决方案。希望有人指出我正在犯的明显错误。

【问题讨论】:

  • egrep 已弃用。请改用grep -E

标签: regex bash grep


【解决方案1】:

根据a related question 此处以及在 grep(和 egrep)中使用扩展和 perl 模式。您将不得不使用一个正则表达式,它返回 only 匹配的组(标签的文本)……像这样(未测试):

grep -oP '<[a-zA-Z]+> \K\[^<]+' test.txt

上面的正则表达式只返回标签的文本,作为匹配组并拒绝任何打开的关闭标签

grep extended patterns

【讨论】:

    【解决方案2】:

    默认情况下grep(和egrep)输出包含匹配模式的行。如果您只想要匹配的模式,请使用 -o 标志。

    来自man egrep

    -o, --only-matching
           Print  only  the  matched  (non-empty) parts of a matching line,
           with each such part on a separate output line.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多