Соответствует строка, которая не содержит другую строку в Bash? - PullRequest
1 голос
/ 27 мая 2019

Я хочу сопоставить строку, которая содержит некоторый текст в начале и конце, но не содержит другой текст в середине. Например: начинается со слова (\ w +) и заканчивается другим, но не содержит NOT между:

some_YES_text   // ok
other_COOL_string  // also ok
some_NOT_string   // don't want to match this

Обычно я мог бы сделать это с отрицательным взглядом:

\w+_(?!NOT)\w+_\w+

Но я пишу скрипт на Bash, который его не поддерживает. Какой самый простой способ добиться того же эффекта?

Редактировать: раньше я не был точен - мне все еще нужно использовать регулярные выражения, а не просто сопоставление простого текста.

1 Ответ

1 голос
/ 27 мая 2019

Вы можете сопоставить abc_NOT_def или abc_anywordhere_def и захватить один из них или его часть, и после матча проверьте, не является ли этот захват пустым.Затем просто реализуйте необходимую логику:

s="other_NOT_string"
rx='^([[:alnum:]_]+_(NOT)_[[:alnum:]_]+|[[:alnum:]_]+_[[:alnum:]_]+_[[:alnum:]_]+)$'
if [[ "$s" =~ $rx ]]; then
 if [ -z ${BASH_REMATCH[2]} ]; then 
   echo "MATCH: ${BASH_REMATCH[0]}"
 else
   echo "No match"
 fi;
else
 echo "No match" 
fi;

Детали

  • ^ - начало строки
  • (- Начало группы 1:
    • [[:alnum:]_]+_ - 1+ слов символов (POSIX ERE \w эквивалент) и _
    • (NOT) - Группа 2: NOT
    • _[[:alnum:]_]+ - _ и 1+ символов слова
    • | - или
    • [[:alnum:]_]+_[[:alnum:]_]+_[[:alnum:]_]+ - 1+ слова символов, _, 1+ словасимволы, _ и снова 1+ слово символов
  • ) - конец группы 1.
  • $ - конец строки

При условии [ -z ${BASH_REMATCH[2]} ] мы проверяем, соответствует ли NOT.Если это так, то нет подходящего совпадения, иначе есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...