我正在尝试使用sed清理URL的行以仅提取域。
来自:
http://www.suepearson.co.uk/product/174/71/3816/
我想要:
(不管有没有训练斜线,都没有关系)
我试过了:
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不需要反斜杠“ /”。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3164518