Я полагаю, что вы ищете то, что напоминает BASH_REMATCH
.
Доступен дополнительный двоичный оператор =~
, имеющий тот же приоритет, что и ==
и !=
,Когда она используется, строка справа от оператора считается расширенным регулярным выражением и соответствующим образом сопоставляется (как в регулярном выражении (3)).Возвращаемое значение равно 0, если строка соответствует шаблону, и 1 в противном случае.Если регулярное выражение синтаксически неверно, возвращаемое значение условного выражения равно 2. Если включена опция оболочки nocasematch
, сопоставление выполняется без учета буквенных символов.Любая часть шаблона может быть заключена в кавычки, чтобы ее можно было сопоставить как строку. Подстроки, соответствующие подвыражениям в скобках внутри регулярного выражения, сохраняются в переменной массива BASH_REMATCH
.Элемент BASH_REMATCH
с индексом 0 является частью строки, соответствующей всему регулярному выражению.Элемент BASH_REMATCH
с индексом n
является частью строки, соответствующей n-му подвыражению в скобках.
К сожалению, шаблоны глобусов и регулярные выражения не совпадают (см. этот вопрос и эта статья linuxjournal ).Тем не менее, мы можем сделать перевод один-к-одному:
|-------+-------+---------------------------------------|
| glob | regex | remark |
|-------+-------+---------------------------------------|
| * | [^/]* | filenames don't have a / |
| **/ | .*/ | ** repreensts full paths (end with /) |
| ? | [^/] | filenames don't have a / |
| [...] | [...] | the character groups are the same |
|-------+-------+---------------------------------------|
Вы должны быть осторожны, поскольку некоторые символы имеют особые значения в регулярных выражениях, но не в глобальных выражениях.(Например, .
, +
):
Итак, в примере с OP вы можете сделать это:
for file in foo-*.csv; do
[[ "${file}" =~ foo-([^/]*)[.]csv ]]
echo "${BASH_REMATCH[1]}"
done
Или более сложный пример:
for file in *-substring-[0-3a-9]-foo?.file
[[ "${file}" =~ ([^/]*)-substring-([0-3a-9])-foo(.)[.]file ]]
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]}"
done