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

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

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

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"

输出是:

ss

但是,如果正则表达式没有匹配任何内容,则返回整个字符串。

regex="aa"

输出:

blossom

这是不正确的。当没有匹配时,不应返回任何内容。如何才能做到这一点?

答案1

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

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

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

答案2

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

答案3

sed 的行为是正确的,它打印出输入字符串 EDITED。显然,如果输入字符串与给定标记没有任何匹配,则结果就是输入字符串。当 regex="aa" 时,评估的标记不匹配并打印出 =“blossom”。

答案4

如果您想不使用“sed”,以下内容应该有效:

[[ $string == *$regex*  ]] && echo $regex

相关内容