我想提取匹配正则表达式的字符串的一部分。考虑以下正确工作的代码:
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)
这是不正确的。如果没有匹配项,则不应返回任何内容。如何做到这一点?
正如 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 打印该行,如果它匹配任何内容,则进行替换。
你的解释是错误的。你告诉我们sed用别的东西代替一些东西;如果它没有找到任何可以替换的内容,为什么要删除任何内容?换句话说,替换会替换匹配的内容,但不会触及不匹配的行。或者,还有另一个重新表述:sed 正确替换了包含aaby的所有行aa。