我有以下字符串
msg="bbb. aaa.ccc. bbb.dddd. aaa.eee."
子字符串之间的分隔符是空格。
我想查看例如"aaa.
“是否存在。在上面的msg中它不存在。
我想查看例如"bbb.
“是否存在。在上面的msg中它存在。
我尝试使用grep,但grep使用换行符作为子串之间的分隔符
怎么做?
答案 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
这适用于dash,所以它也适用于灰:
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