我在bash中执行以下命令:
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -rn 's#^URL: \^/tags/([^/]+)/#\1#p'
我认为这应该只输出匹配的行和捕获组的内容。所以我期待0.0.0
作为结果。但我得到了0.0.0abcd
为什么包含/
左侧和右侧的捕获组部分?我做错了什么?
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' |
sed -rn 's#^URL: \^/tags/([^/]+)/#\1#p'
echo
输出两行:
UNUSED
URL: ^/tags/0.0.0/abcd
给sed
的正则表达式与第一行不匹配,因此不打印此行。正则表达式匹配第二行,因此URL: ^/tags/0.0.0/
替换为0.0.0
;只更换了该行的匹配部分,因此abcd
不变。
要获得所需的输出,您还必须匹配abcd
,例如
sed -rn 's#^URL: \^/tags/([^/]+)/.*#\1#p'
其中.*
将所有字符吃到行尾。
你可以使用awk
:
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | awk -F/ 'index($0, "^/tags/"){print $3}'
0.0.0
这个awk
命令使用/
作为字段分隔符,并在输入中有^/tags/
文本时打印第3列。
或者,您可以使用gnu grep
:
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | grep -oP '^URL: \^/tags/\K([^/]+)'
0.0.0
或者这个sed
:
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -nE 's~^URL: \^/tags/([^/]+).*~\1~p'
0.0.0
这个sed抓住你想要的输出。
echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -E '/URL/!d;s#.*/(.*)/[^/]*#\1#'