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

时间:2017-12-19 11:40:39

标签: bash sed

我在bash中执行以下命令:

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

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

这个sed捕捉到你想要的输出。

echo -e 'UNUSED\nURL: ^/tags/0.0.0/abcd' | sed -E '/URL/!d;s#.*/(.*)/[^/]*#\1#'