Как я могу найти строку с regex в Баш?

Я пытаюсь написать bash-скрипт, который содержит функцию, поэтому, когда дали .деготь, .тар.bz2 файл, `.tar.gz и т. д. файл он использует смолу с соответствующими переключателями для распаковки файла.

Я использую если Элиф то заявления, которые проверить имя файла, чтобы увидеть, что он заканчивается и я не могу получить его, чтобы соответствовать с помощью регулярных выражений метасимволы.

Чтобы постоянно сохранять переписывать скрипт я использую 'тест' в командной строке, я думал, приведенная ниже инструкция должна работать, я пробовал все комбинации скобок, кавычек и можно metacharaters и до сих пор это не удается.

test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)

Я'м уверены, что проблема проста и я'вэ посмотрел везде, но я не могу понять как это сделать. Кто-нибудь знает как я могу это сделать?

Решение

Для сопоставления регулярных выражений нужно использовать оператор=~.

Попробуйте это:

[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched

Кроме того, вы можете использовать подстановочные знаки (а не выражений) с помощью оператора==:

[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched

Если портативность не важна, я рекомендую использовать [[ вместо [ или тест как это безопаснее и мощнее. Видите какая разница между тест, [ и [[ ?]1 для деталей.

Комментарии (8)

Функция Для Этого

extract () {
  if [ -f $1 ] ; then
      case $1 in
          *.tar.bz2)   tar xvjf $1    ;;
          *.tar.gz)    tar xvzf $1    ;;
          *.bz2)       bunzip2 $1     ;;
          *.rar)       rar x $1       ;;
          *.gz)        gunzip $1      ;;
          *.tar)       tar xvf $1     ;;
          *.tbz2)      tar xvjf $1    ;;
          *.tgz)       tar xvzf $1    ;;
          *.zip)       unzip $1       ;;
          *.Z)         uncompress $1  ;;
          *.7z)        7z x $1        ;;
          *)           echo "don't know '$1'..." ;;
      esac
  else
      echo "'$1' is not a valid file!"
  fi
}

Примечание

В ответ на Водолей сила в комментарии выше, мы должны хранить регулярное выражение переменной`

Переменная BASH_REMATCH задается после матча выражение, и ${BASH_REMATCH[н]} будет соответствовать N-й группы, завернутый в скобках, т. е. в следующий ${BASH_REMATCH[1]} = с "сжатый" В и ${BASH_REMATCH[2]} = с ".я ГЗ&;

if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]]; 
then 
  echo ${BASH_REMATCH[2]} ; 
else 
  echo "Not proper format"; 
fi

(В описаный выше это'т должно быть допустимым в имени файла и расширения, но это для примера)

Комментарии (3)

Я не'т иметь достаточно репутации, чтобы комментарий здесь, так что я'м представляет новое решение для улучшения dogbane'ы ответ. Точка . в регулярном выражении

[[ СЭД-4.2.2.тар.расширением bz2 =~ смол.bz2 файл$ ]] &ампер;&ампер; Эхо совпали

фактически соответствует любому символу, не только на обычную точку между 'тар.bz2, что', например

[[ sed-4.2.2.tar4bz2 =~ tar.bz2$ ]] && echo matched
[[ sed-4.2.2.tar§bz2 =~ tar.bz2$ ]] && echo matched

или то, что не'т требует побега с '\'. Тогда строгий синтаксис должен быть

[[ sed-4.2.2.tar.bz2 =~ tar\.bz2$ ]] && echo matched

или вы можете пойти еще строже, а также включают в себя предыдущие точка в регулярном выражении:

[[ sed-4.2.2.tar.bz2 =~ \.tar\.bz2$ ]] && echo matched
Комментарии (0)

Поскольку вы используете bash, вы Дон'т необходимость создания дочернего процесса для этого. Вот одно решение, которое выполняет его целиком в bash:

[[ $TEST =~ ^(.*):\ +(.*)$ ]] && TEST=${BASH_REMATCH[1]}:${BASH_REMATCH[2]}

Объяснение: группы до и после последовательности, что "двоеточие и один или более пробелов на" хранятся по шаблону оператором матч в BASH_REMATCH массива.

Комментарии (2)

shopt -с nocasematch

if [[ sed-4.2.2.$LINE =~ (yes|y)$ ]]
 then exit 0 
fi
Комментарии (0)
if [[ $STR == *pattern* ]]
then
    echo "It is the string!"
else
    echo "It's not him!"
fi

Работает для меня! В GNU bash, начиная с версии 4.3.11(1)-релиз (x86_64 с-ПК-Линукс-гну)

Комментарии (3)