1

我遇到了这个问题,在尝试 grep html 页面(特别是用户名)上的某些内容时,我尝试通过以下方式检索字符串:

egrep -o dir\=\"[ltr]*\"\>.*(\<\/span|\<\/a)

通过这个我想说:“在 dir=("ltr or rlt")> 之后和第一个</a></span>结束标签之前得到任何东西。

例如:

dir="ltr">myusername</span>

或者

dir="rtl">myusername</a>

然而,一行上有多个跨度标签,并且在第一个标签之后并没有停止,这导致了我不想要的数据。

有没有办法修改我当前的正则表达式以在第一个正则表达式之后停止?为什么它还要继续阅读?

谢谢

4

2 回答 2

2

您需要.*通过添加 a 来使其不贪心?

egrep -o dir\=\"[ltr]*\"\>.*?(\<\/span|\<\/a)

更好的解决方案是这样(在原始正则表达式中,您需要对其进行转义):

dir="[ltr]{3}"[^>]*?>(.*?)(</span>|</a>)

捕获组 1 ($1) 将包含它之间的内容,捕获组 2 ($2) 将包含它的跨度或链接终止。

看看它在行动: http ://regexr.com?32b8k

于 2012-10-03T02:14:11.490 回答
0

GNU sed会这样做:

sed -r 's/(dir="ltr"|dir="rtl")>([^<]+)(<\/span>|<\/a>).*/\2/' file.txt

您可以通过一些简化使正则表达式更聪明、更易于阅读:

sed -r 's/dir="(ltr|rtl)">([^<]+)<\/(span|a)>.*/\2/' file.txt
于 2012-10-03T03:55:14.977 回答