我遇到了这个问题,在尝试在html页面上显示某些内容(特别是用户名)时,我尝试通过以下方式检索字符串:
egrep -o dir\=\"[ltr]*\"\>.*(\<\/span|\<\/a)
通过这个我试图说:“在dir =(”ltr或rlt“)&gt;之后和第一个</a>
或</span>
结束标记之前得到任何东西。
所以例如:
dir="ltr">myusername</span>
或
dir="rtl">myusername</a>
但是在一行上有多个span标记,并且在第一行之后没有停止,这会产生我不想要的数据。
有没有办法修改我当前的正则表达式在第一个之后停止?为什么它甚至继续阅读?
由于
答案 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