Использование переменной в качестве шаблона для команды case

grepне имеет опции AND для сопоставления нескольких шаблонов, но вы можете по существу ИЛИ сопоставлять шаблоны, используя |. Если вы используете расширенный синтаксис, вы можете комбинировать несколько шаблонов со всеми их комбинациями :

.
a.*b.*c|a.*c.*b|b.*a.*c|b.*c.*a|c.*a.*b|c.*b.*a

Но, вероятно, это не очень хорошая идея, если у вас есть более двух паттернов, так как количество комбинаций быстро растет.

Вы можете комбинировать свои zgrepкоманды, используя -exec. Используйте тихую опцию -qдля каждого zgrep, кроме последнего (, который печатает имя файла, если он и все предыдущие greps нашли совпадение ).

find -mtime -$a -type f ! -name "*.bak*"      \
        -exec zgrep -iq "$b" {} \;            \
        -exec zgrep -iq "$c" {} \;            \
        -exec zgrep -il "$d" {} \; | sort
6
03.11.2019, 05:46
1 ответ

Поскольку у вас всего два ответа, я не думаю, что caseздесь правильное решение. Много способов сделать это; Я бы сделал что-то вроде этого:

action_list="list|add|remove|foo|bar"
if grep -qE "^(${action_list})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi

Если вы используете bash или оболочку с аналогичным расширением переменных, это может быть предпочтительнее для удобочитаемости переменной списка:

action_list="list add remove foo bar"
if grep -qE "^(${action_list// /|})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi
1
27.01.2020, 20:28

Теги

Похожие вопросы