使用捕获组时,sed的输出会产生奇怪的结果

问题描述 投票:0回答:3

我在bash中执行以下命令:

echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -rn 's#^URL: \^/tags/([^/]+)/#\1#p'

我认为这应该只输出匹配的行和捕获组的内容。所以我期待0.0.0作为结果。但我得到了0.0.0abcd

为什么包含/左侧和右侧的捕获组部分?我做错了什么?

bash sed
3个回答
2
投票
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'

其中.*将所有字符吃到行尾。


1
投票

你可以使用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

0
投票

这个sed抓住你想要的输出。

echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -E '/URL/!d;s#.*/(.*)/[^/]*#\1#'
© www.soinside.com 2019 - 2024. All rights reserved.