Интересно, какое общее правило использовать регулярное выражение в предложении if в bash?
Вот пример
$ gg=svm-grid-ch
$ if [[ $gg == *grid* ]] ; then echo $gg; fi
svm-grid-ch
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi
$
Почему последние три не совпадают?
Надеюсь, вы могли бы дать как можно больше общих правил, а не только для этого примера.
Использовать
=~
для регулярных выражений проверьте Учебное пособие по регулярным выражениям Содержание
источник
if [[ $gg =~ ^....grid.* ]]
источник
Добавление этого решения с
grep
базовымиsh
встроенными командами для тех, кто заинтересован в более переносимом решении (независимо отbash
версии; также работает с простой старой версиейsh
, на платформах, отличных от Linux и т. Д.)# GLOB matching gg=svm-grid-ch case "$gg" in *grid*) echo $gg ;; esac # REGEXP if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi # Extended REGEXP if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then echo $gg fi
Некоторые
grep
версии также поддерживают параметр-q
(тихий) в качестве альтернативы перенаправлению на/dev/null
, но перенаправление снова является наиболее переносимым.источник
grep -q
вместоgrep >/dev/null
.@OP,
Нет, шаблон "glob" используется не только для имен файлов. вы также можете использовать его для сравнения строк. В ваших примерах вы можете использовать case / esac для поиска шаблонов строк.
gg=svm-grid-ch # looking for the word "grid" in the string $gg case "$gg" in *grid* ) echo "found";; esac # [[ $gg =~ ^....grid* ]] case "$gg" in ????grid*) echo "found";; esac # [[ $gg =~ s...grid* ]] case "$gg" in s???grid*) echo "found";; esac
Регулярные выражения более универсальны и «удобны», чем «глобальные шаблоны», однако, если вы не выполняете сложные задачи, которые «глобальное / расширенное глобальное выражение» не может обеспечить легко, тогда нет необходимости использовать регулярное выражение. Регулярные выражения не поддерживаются для версии bash <3.2 (как упоминал Деннис), но вы все равно можете использовать расширенную глобализацию (путем настройки
extglob
). для расширенного подстановки см. здесь и несколько простых примеров здесь .Обновление для OP: пример поиска файлов, которые начинаются с 2 символов (точки "." Означает 1 символ), за которыми следует "g" с использованием регулярного выражения
например, вывод
$ shopt -s dotglob $ ls -1 * abg degree ..g $ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done abg degree ..g
В приведенном выше примере файлы совпадают, потому что их имена содержат 2 символа, за которыми следует «g». (т.е.
..g
).Эквивалент с подстановкой будет примерно таким: (см. В справочнике значение
?
и*
)$ for file in ??g*; do echo $file; done abg degree ..g
источник
ls ..g
не работает. Вы говорите оболочке искать файл с именем..g
. Что же касается изучения синтаксиса регулярных выражений, вы можете попробоватьperldoc perlretut
,perldoc perlrequick
или сделатьinfo sed
в командной строке.