我遇到了这个问题,在尝试在 html 页面上 grep 某些内容(特别是用户名)时,我尝试通过说以下内容来检索字符串:
egrep -o dir="[ltr]*">.*(</span|</a)
通过这个,我想说:"在 dir=("ltr 或 rlt")> 之后和第一个</a>
或</span>
结束标签之前获取任何内容。
所以例如:
dir="ltr">myusername</span>
或
dir="rtl">myusername</a>
但是,一行上有多个 span 标签,并且在第一行之后它不会停止,这会导致我不想要的数据。
有没有办法修改我当前的正则表达式以在第一个正则表达式之后停止? 为什么它甚至继续阅读?
谢谢
通过向.*
添加?
来使其不贪婪。
egrep -o dir="[ltr]*">.*?(</span|</a)
一个更好的解决方案是这样的(在原始正则表达式中,您需要对其进行转义):
dir="[ltr]{3}"[^>]*?>(.*?)(</span>|</a>)
捕获组 1 ($1) 将包含它之间的内容,捕获组 2 ($2) 将包含它是跨度还是链接终止。
查看实际操作:http://regexr.com?32b8k
我会用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