sed中的非贪婪(勉强)正则表达式匹配?

末鹿安然 提交于 2020-02-26 23:09:35

我正在尝试使用sed清理URL的行以仅提取域。

来自:

http://www.suepearson.co.uk/product/174/71/3816/

我想要:

http://www.suepearson.co.uk/

(不管有没有训练斜线,都没有关系)

我试过了:

 sed 's|\(http:\/\/.*?\/\).*|\1|'

和(转义非贪婪量词)

sed 's|\(http:\/\/.*\?\/\).*|\1|'

但我似乎无法使非贪婪量词( ? )正常工作,因此它最终总是与整个字符串匹配。


#1楼

在这种情况下,您无需使用非贪婪的正则表达式就可以完成工作。

试试这个非贪婪的正则表达式[^/]*而不是.*?

sed 's|\(http://[^/]*/\).*|\1|g'

#2楼

基本的或扩展的Posix / GNU正则表达式都不能识别非贪婪的量词; 您需要稍后的正则表达式。 幸运的是,在这种情况下,Perl正则表达式非常容易获得:

perl -pe 's|(http://.*?/).*|\1|'

#3楼

sed 's|(http:\/\/[^\/]+\/).*|\1|'

#4楼

不使用正则表达式的另一种方法是使用字段/定界符方法,例如

string="http://www.suepearson.co.uk/product/174/71/3816/"
echo $string | awk -F"/" '{print $1,$2,$3}' OFS="/"

#5楼

sed不支持“非贪婪”运算符。

您必须使用“ []”运算符将“ /”排除在匹配之外。

sed 's,\(http://[^/]*\)/.*,\1,'

PS不需要反斜杠“ /”。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!