linux - 使用 grep 比较两个字符串

标签 linux bash shell

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

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

命令返回 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。

关于linux - 使用 grep 比较两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22631415/

相关文章:

linux - 使用 FFMPEG 转换为 mp4 的 Shell 脚本会产生两次附加 .mp4 扩展名的新视频

mysql - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : NO) - what's wrong?

检查用户名 : getpwnam/getpwnam_r: No such file or directory

c++ - C/C++ 中的多线程状态机实现

linux - 通过安全 http 的 SVN checkout 失败并出现内存故障

regex - sed:在匹配之前显示行

linux - ls -l 在 2 个服务器中输出不同

linux - 使用 awk 或其他转换最后一列中的日期格式

linux - 2 个字符串的所有排列和组合的列表

shell - 在 hadoop 集群中运行 bash 脚本的 Hadoop 命令