sed 不区分完全正则表达式匹配和不匹配

Ksh*_*rma 8 bash sed

我想提取匹配正则表达式的字符串的一部分。考虑以下正确工作的代码:

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"
Run Code Online (Sandbox Code Playgroud)

输出是:

ss
Run Code Online (Sandbox Code Playgroud)

但是,如果正则表达式不匹配,则返回整个字符串。

regex="aa"
Run Code Online (Sandbox Code Playgroud)

输出:

blossom
Run Code Online (Sandbox Code Playgroud)

这是不正确的。如果没有匹配项,则不应返回任何内容。如何做到这一点?

Gre*_*ett 7

正如 choroba 所说,默认情况下 sed 将始终打印该行,并带有任何匹配的替换。你可以做你想做的:

regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"
Run Code Online (Sandbox Code Playgroud)

-n 告诉 sed 不要打印该行,然后 s/ 命令末尾的 p 告诉 sed 打印该行,如果它匹配任何内容,则进行替换。


cho*_*oba 2

你的解释是错误的。你告诉我们sed用别的东西代替一些东西;如果它没有找到任何可以替换的内容,为什么要删除任何内容?换句话说,替换会替换匹配的内容,但不会触及不匹配的行。或者,还有另一个重新表述:sed 正确替换了包含aaby的所有行aa