grep只在两个字符串之间的区域

时间:2012-10-03 02:09:51

标签: regex linux bash grep

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

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

通过这个我试图说:“在dir =(”ltr或rlt“)&gt;之后和第一个</a></span>结束标记之前得到任何东西。

所以例如:

dir="ltr">myusername</span>

dir="rtl">myusername</a>

但是在一行上有多个span标记,并且在第一行之后没有停止,这会产生我不想要的数据。

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

由于

2 个答案:

答案 0 :(得分:2)

您需要向.*添加?非贪婪。

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

更好的解决方案就是这个(在原始正则表达式中,你需要转义它):

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

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

看到它的实际效果: http://regexr.com?32b8k

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