使用grep比较两个字符串


echo "abc-vcu def" | grep -w "abc.vcu" 
echo $?

上面一行的输出为0。但abc-vcu = abc.vcudef = abc.vcu。所以它应该返回1

Command返回true,因为它假设.-是相同的。如何进行精确比较?

通过简单的字符串比较可以更好地实现您所尝试的。

if [[ "abc-vcu def" == *"abc.vcu"* ]]; then
    echo "String B contained in String A"
else
    echo "No containment"
fi

还要注意这是如何避免检查$?的反模式的。更详细地说,任何看起来像

的东西
command
if [ $? == 0 ]; then ...

最好写成

if command; then ...
顺便说一句,如果你真的想要或必须使用grep,你需要了解一些选项。grep匹配正则表达式,而不仅仅是字符串。有一个单独的选项可以将搜索表达式更改为字符串,即-F(传统上作为单独的命令fgrep可用):
echo moo | grep m.o     # true
echo moo | grep -F m.o  # false

为了完整起见,还要注意grep在输入的任何地方查找匹配。所以echo moo | grep o是正确的。如果你真的想寻找一个精确的匹配,你需要-x选项(或者改变你正在搜索的表达式):

echo moo | grep -x moo
echo moo | grep '^moo$'

像@Kent注释一样,grep将默认打印任何匹配的行,您可能不希望在这里运行grep来查看是否有匹配。所以你也需要-q标志。总而言之,

echo "abc-vcu def" | grep -Fxwq "abc.vcu"

最后,您可能还应该知道case:

case "abc-vcu def" in *"abc.vcu"*) echo true;; *) echo false;; esac

[[只测试bash不同,case可以一直移植到原始的Bourne shell。

grep中.表示任意字符(正则表达式语法)

如果您需要匹配.,请尝试.

echo "abc-vcu def" | grep -w "abc.vcu"
echo $?

如果您想在这种情况下使用grep,请按如下方式使用:

echo "abc-vcu def" | grep -F -w "abc.vcu"

man grep表示使用-F grep必须

将PATTERN解释为固定字符串列表

这修复了.被识别为'任意符号'模式的问题。

您可以让bash来代替使用grep,特别是如果您打算使用变量:

string1='abc-vcu def'
string2='abc.vcu'
[[ ! ${string1/*${string2}*/} ]]
echo $?

[[ expression ]]返回01,这取决于expression的求值。

!逻辑非

${parameter/pattern/string}string取代parameter中第一个出现的pattern,其中pattern被展开,就像在路径名展开中一样。对于上述情况,这意味着如果$string2出现在$string1中的任何位置,$string1将完全被''(一个空字符串)所取代,这是一个逻辑假

最新更新