非贪婪(不情愿)正则表达式在sed中匹配?
我正在尝试使用sed来清理网址以提取域名..
所以来自:
http://www.suepearson.co.uk/product/174/71/3816/
我想要:
http://www.suepearson.co.uk/
(无论是否有训练斜线,都没关系)
我努力了:
sed 's|(http://.*?/).*|1|'
和(逃避非贪婪量词)
sed 's|(http://.*?/).*|1|'
但我似乎无法让非贪婪量词工作,所以它总是匹配整个字符串。
基本或扩展的Posix / GNU正则表达式都不识别非贪婪量词; 你需要一个更晚的正则表达式。 幸运的是,这个上下文的Perl正则表达式很容易获得:
perl -pe 's|(http://.*?/).*|1|'
试试[^/]*
而不是.*?
:
sed 's|(http://[^/]*/).*|1|g'
对于sed,我通常通过搜索除分隔符之外的任何内容来实现非贪婪搜索,直到分隔符:
echo "http://www.suon.co.uk/product/1/7/3/" | sed -n 's;(http://[^/]*)/.*;1;p'
输出:
http://www.suon.co.uk
这是:
-n
s/<pattern>/<replace>/p
;
搜索命令分隔符而不是/
使其更容易输入s;<pattern>;<replace>;p
(
... )
之间的匹配,稍后可以用1
, 2
...进行访问...... http://
[]
的任何内容, [ab/]
表示a
或b
或/
^
in []
意思not
,所以除了[]
的东西之外 [^/]
意味着除/
字符以外的任何内容 *
是重复上一组,因此[^/]*
表示除/
之外的字符。 sed -n 's;(http://[^/]*)
表示搜索并记住http://
后跟除/
之外的任何字符,并记住您找到的内容 /
所以添加另一个/
最后: sed -n 's;(http://[^/]*)/'
但我们想匹配域名之后的其余部分如此添加.*
1
)中记住的比赛是域,因此用组1
保存的东西替换匹配的线并且打印: sed -n 's;(http://[^/]*)/.*;1;p'
如果你想在域之后加入反斜杠,那么在组中添加一个反斜杠来记住:
echo "http://www.suon.co.uk/product/1/7/3/" | sed -n 's;(http://[^/]*/).*;1;p'
输出:
http://www.suon.co.uk/
链接地址: http://www.djcxy.com/p/47123.html