1

我有以下字符串

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

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

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

例如,我想检查 "bbb.“是否存在。在上面的味精中它是否存在。

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

怎么做?

4

2 回答 2

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

这适用于,所以它也应该适用于 ash :

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
于 2013-09-30T16:34:56.583 回答
0

最简单的方法是使用-wwith 选项grep,这会阻止aaa.匹配aaa.ccc

if fgrep -qw 'aaa.' <<< "$msg"; then
    # Found aaa.
else:
    # Did not find aaa.
fi  
于 2013-09-30T16:35:10.450 回答