2013-09-30 1 views
1

я следующую строкукак проверить, если подстрока существует

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

разделитель между суб строк является пространство.

Я хочу, чтобы проверить, например, если "aaa. «существует. В приведенном выше сообщ не существует.

Я хочу, чтобы проверить, например, если "bbb.» существует. в приведенном выше msg существует.

Я попытался с Grep, но Grep работает с новой строкой в ​​качестве разделителей между подстроками

Как сделать это?

ответ

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 
+0

Не знаю, если [тег: зола] имеет одинаковый образ в двойных скобках. –

+0

exatelly I m работает с золой и [[]] не поддерживается – MOHAMED

0

Самый простой способ заключается в использовании -w вариант с grep, который предотвратил бы aaa. от соответствия aaa.ccc.

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

Вам нужно уйти от точки. –

+0

Я тестирую, что он не работает – MOHAMED

+0

К сожалению, я намеревался использовать 'fgrep' и забыл. – chepner