Как я могу найти строку с regex в Баш?
Я пытаюсь написать bash-скрипт, который содержит функцию, поэтому, когда дали .деготь
, .тар.bz2 файл
, `.tar.gz и т. д. файл он использует смолу с соответствующими переключателями для распаковки файла.
Я использую если Элиф то заявления, которые проверить имя файла, чтобы увидеть, что он заканчивается и я не могу получить его, чтобы соответствовать с помощью регулярных выражений метасимволы.
Чтобы постоянно сохранять переписывать скрипт я использую 'тест' в командной строке, я думал, приведенная ниже инструкция должна работать, я пробовал все комбинации скобок, кавычек и можно metacharaters и до сих пор это не удается.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Я'м уверены, что проблема проста и я'вэ посмотрел везде, но я не могу понять как это сделать. Кто-нибудь знает как я могу это сделать?
Для сопоставления регулярных выражений нужно использовать оператор
=~
.Попробуйте это:
Кроме того, вы можете использовать подстановочные знаки (а не выражений) с помощью оператора
==
:Если портативность не важна, я рекомендую использовать
[[
вместо[
илитест
как это безопаснее и мощнее. Видите какая разница между тест, [ и [[ ?]1 для деталей.Функция Для Этого
Примечание
В ответ на Водолей сила в комментарии выше, мы должны хранить регулярное выражение переменной`
Переменная BASH_REMATCH задается после матча выражение, и ${BASH_REMATCH[н]} будет соответствовать N-й группы, завернутый в скобках, т. е. в следующий
${BASH_REMATCH[1]} = с "сжатый"
В и${BASH_REMATCH[2]} = с ".я ГЗ&;
(В описаный выше это'т должно быть допустимым в имени файла и расширения, но это для примера)
Я не'т иметь достаточно репутации, чтобы комментарий здесь, так что я'м представляет новое решение для улучшения dogbane'ы ответ. Точка . в регулярном выражении
[[ СЭД-4.2.2.тар.расширением bz2 =~ смол.bz2 файл$ ]] &ампер;&ампер; Эхо совпали
фактически соответствует любому символу, не только на обычную точку между 'тар.bz2, что', например
или то, что не'т требует побега с '\'. Тогда строгий синтаксис должен быть
или вы можете пойти еще строже, а также включают в себя предыдущие точка в регулярном выражении:
Поскольку вы используете bash, вы Дон'т необходимость создания дочернего процесса для этого. Вот одно решение, которое выполняет его целиком в bash:
Объяснение: группы до и после последовательности, что "двоеточие и один или более пробелов на" хранятся по шаблону оператором матч в BASH_REMATCH массива.
shopt -с nocasematch
Работает для меня!
В GNU bash, начиная с версии 4.3.11(1)-релиз (x86_64 с-ПК-Линукс-гну)