使用grep比较两个字符串

时间:2014-03-25 10:15:33

标签: linux bash shell

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

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

命令返回true,因为它假定.-相同。如何进行精确比较?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

而不是使用grep,您可以让bash完成工作,特别是如果您打算使用变量:

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

[[ expression ]]会返回01,具体取决于expression的评估。

!逻辑而非

${parameter/pattern/string}patternparameter的第一次出现替换为string,其中pattern的扩展与路径名扩展一样。对于上述情况,这意味着如果$string2中出现$string1,则$string1完全被''(空字符串)替换,这是逻辑错误

答案 2 :(得分:1)

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

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

man grep-F grep必须

  

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

这解决了.被识别为'任何符号'的问题。图案。

答案 3 :(得分:0)

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

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。