grep命令始终包含具有匹配输出的html标记

时间:2015-04-11 08:21:03

标签: regex bash grep

这是一个奇怪的问题..

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

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

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

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

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

每当grep找到匹配项时,它会输出单词以及两侧的html标记!这只发生在匹配中,因为我通过让regex参数变成乱码来测试它,比如'09680876' - 它在临时文件中没有匹配,而grep没有输出任何内容。

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

.... | egrep 'hanai')

我知道'hanai'在示例文本中是明确的匹配。这导致了grep输出

<td>hanai</td>

我完全难过,无法在线找到解决方案。非常感谢有人指出我正在犯的明显错误。

2 个答案:

答案 0 :(得分:3)

根据a related question这里使用grep(和egrep)中的扩展和perl模式。你必须使用一个正则表达式,它返回匹配的组(标签文本)......这样(未经测试):

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

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

grep extended patterns

答案 1 :(得分: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.