2016-02-24 2 views
0

У меня есть некоторое регулярное выражение, которое ведет себя странно в моем сценарии оболочки. У меня есть переменные, и я пробовал каждый способ заставить их вести себя, и они, похоже, не делают никакого регулярного выражения, и я знаю свое регулярное выражение достаточно хорошо благодаря regex101, вот что образец выглядитshell script odd regex

fname="direcheck" 
FIND="*" 
if [[ $fname =~ $FIND ]]; then 
echo "no quotes" 
fi 

if [[ "$fname" =~ "$FIND" ]]; then 
echo "with quotes" 
fi 

сейчас он не покажет ничего , если я изменю найти в

FIND="[9]*" 

тогда не печатает без кавычек , если я говорю

FIND="[a-z]*" 

тогда не печатает без кавычек

если я говорю

FIND="dircheck" 

тогда ничего не печатает

если я говорю

FIND="*ck" 

тогда ничего не печатает

Я не понимаю, как это регулярное выражение работает

как я использовать эти переменные, и что такое правильный синтаксис?

ответ

0

я, наконец, понял это, и почему она работает так, как ни странно

[а-г] * и [9] * и [anythinghere] * они весь матч, потому что он соответствует ноль или более раз. поэтому «direcheck» имеет [9] ноль или более раз.

так

if [[ "$fname" =~ $FIND ]]; then 

или

if [[ $fname =~ $FIND ]]; then 

являются правильными, и только

if [[ "$fname" =~ "$FIND" ]]; then 

матчи, когда строка соответствует именно потому, что $FIND подобран как буквенная строка не Regex

1
  • * и *ck являются недействительными регулярными выражениями. Он работал бы (без кавычек), если бы вы сравнивали ==, а не =~. Если вы хотите использовать ту же функциональность, которую вы получаете в == для них, эквивалентные регулярные выражения: .* и .*ck.

  • [9]* - любое число (включая нуль) символов 9. В вашем direcheck нулевых символов 9, поэтому он соответствует. (Отредактировано из brainfart, thanks chepner)

  • dircheck не найден в direcheck, поэтому ничего не печатать ничего удивительного.

  • [a-z]* представляет собой любое число символов, которые находятся между a и z (т.е. любого количества строчных букв). Это будет соответствовать, если предположить, что он не цитируется.

+0

@ ritesht93: Да, 1-й пункт. Глобусы '==', регулярные выражения '= ~'. – Amadan

+0

также не смешивать 'glob' и' = ~ 'regex – ritesht93

+1

Строго говоря,' * 'является * правильным * регулярным выражением; он соответствует строке, содержащей звездочку. Без маркера для изменения звездочка теряет свое особое значение как квантификатор и становится просто звездочкой. Например, 'printf 'one * \ ntwo \ n' | grep '*' '. – ghoti