如何检查子字符串是否存在

时间:2013-09-30 16:29:04

标签: shell ash

我有以下字符串

msg="bbb. aaa.ccc. bbb.dddd. aaa.eee."

子字符串之间的分隔符是空格

我想查看例如"aaa.“是否存在。在上面的msg中它不存在。

我想查看例如"bbb.“是否存在。在上面的msg中它存在。

我尝试使用grep,但grep使用换行符作为子串之间的分隔符

怎么做?

2 个答案:

答案 0 :(得分:2)

这可以使用模式匹配在bash中完成。你想检查是否

  • 子字符串位于字符串的开头
  • 子字符串位于中间,或
  • 子字符串在最后
# pass the string, the substring, and the word separator
matches() {
    [[ $1 == $2$3* ]] || [[ $1 == *$3$2$3* ]] || [[ $1 == *$3$2 ]]
}
msg="bbb. aaa.ccc. bbb.dddd. aaa.eee."
matches "$msg" "aaa." " " && echo y || echo n
matches "$msg" "bbb." " " && echo y || echo n
n
y

这适用于,所以它也适用于灰:

str_contains_word() {
    sep=${3:-" "}
    case "$1" in
        "$2$sep"* | *"$sep$2$sep"* | *"$sep$2") return 0;;
        *) return 1;;
    esac
}

msg="bbb. aaa.ccc. bbb.dddd. aaa.eee."
for substr in aaa. bbb.; do
    printf "%s: " "$substr"
    if str_contains_word "$msg" "$substr"; then echo yes; else echo no; fi
done

答案 1 :(得分:0)

最简单的方法是将-w选项与grep一起使用,这会阻止aaa.aaa.ccc匹配。

if fgrep -qw 'aaa.' <<< "$msg"; then
    # Found aaa.
else:
    # Did not find aaa.
fi