我正在尝试捕获URL路径以产生没有前导和结尾斜杠/
的部分。应匹配修剪前后的空输入字符。所需的正则表达式将表现如下:
input-string captured-string
-----------------------------------
/a/b/c/ a/b/c
/a/b/c a/b/c
/ (empty)
(empty) (empty)
我使用echo /a/b/c/d | sed -nr 's=(/(.+?)/)?=\2=p'
及其风格作为gurus建议的测试工具,并注意到以下正则表达式无法完成工作:
regex input-string wrong capture
---------------------------------------------
(/(.+?)/)? /a/b/c a/bc
(/(.+?)/) /a/b/c a/bc
(/(.+?)/) /a (doesn't match)
(/(.+?)/?) /a/b/c/ a/b/c/
(/([^/]+)/?) /a/b/c ab/c
(/([^/.+])/?) /a/b/c ab/c
/*(.*?)/* /a/b/c/ a/b/c/
The alleged correct answer似乎无法正常工作:
echo /a/b/c | sed -nr 's=/*(?<x>.*?)/*=\k<x>=p'
因为它提供了此错误消息:
sed: -e expression #1, char 23: Invalid preceding regular expression
非常感谢帮助。
编辑:正如CompuChip
所指出的,我使用了错误的测试工具sed
,它似乎不支持非贪婪的修饰符。我使用的实际正则表达式引擎是boost::regex_match()
,它给出了正确的结果,例如/?(.*?)/?
。所以我想结束这个问题。
答案 0 :(得分:1)
尝试关注sed
sed -r 's:^/|/$::'
简短说明
匹配:^/|/$
= ^/
或/$
,即前导和尾随斜杠
替换:(空)即修剪比赛
<强>测试强>
$ cat file
/a/b/c/
/a/b/c
/
$ sed -r 's:^/|/$::' file
a/b/c/
a/b/c
答案 1 :(得分:0)
如果只是这种条目(所以不在其他字符串内)
sed "s#$#/#;s#^[^/].*##;s#/*$##;s#^/##"
不要回避// bad / path /
这样的事情