как написать это grep регулярное выражение - PullRequest
2 голосов
/ 24 декабря 2010
if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then

синтаксическая ошибка, я просто хочу проверить расширение файла.

Ответы [ 3 ]

4 голосов
/ 24 декабря 2010

Прежде всего, вам нужно удалить '', иначе тест - это просто строка, которая всегда имеет значение true. Вы должны поместить регулярное выражение в кавычки, поскольку скобки интерпретируются bash. Вам также необходимо использовать egrep (эквивалентно grep -E).

if [ `echo "$url" | egrep "(\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$"` ] ; then

Вы также можете сократить регулярное выражение, выделив . из группы и сгруппировав tar.{gz,bz2}:

if [ `echo "$url" | egrep "\.(tar\.(gz|bz2)|zip|rar|7z)$"` ] ; then

В будущем, пожалуйста, обратите внимание на ошибку, которую дает вам bash, которая говорит вам о многом: bash: syntax error near unexpected token ( предполагает, что ошибка находится около (, который я только что показал вам, именно там, где лежит ошибка

Ответ Джонатана предлагает больше советов по улучшению теста.

3 голосов
/ 24 декабря 2010

Дано:

if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then

Само по себе, это не синтаксическая ошибка - любая синтаксическая ошибка, вероятно, рядом.

С другой стороны, это тоже не то, что вы хотите. Строка между квадратными скобками заключена в одинарные кавычки; это само по себе. Тест проверяет, является ли строка пустой (нет), и продолжает выполнение кода в предложении then.

Вам нужно использовать что-то вроде:

if [ $(echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' ) ] ; then
  • Используйте '$(...)' вместо обратных тиков.
  • Используйте 'grep -E' для активации расширенных регулярных выражений.
  • Фактор лидирующих '.' из расширений.
  • Помните, что '.tgz' является допустимым (хотя и редким) расширением для сжатых tar-файлов.

И затем, как Деннис указывает в комментарии, вы можете заметить, что совсем не обязательно использовать тестовую команду или подстановку команд:

if echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' >/dev/null ; then

Это проверяет состояние выхода конвейера, которое является состоянием выхода из grep, которое будет 0 (успех), если один из суффиксов был распознан, и 1 (сбой), если ни один из них не был. И затем, если мы используем Bash, вы также можете избежать конвейера:

if grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' <<< "$url" >/dev/null ; then

И мы также можем вообще избежать использования второго процесса, переписав код для использования оператора case:

case "$url" in
(*.tar.gz|*.tar.bz2|*.zip|*.rar|*.7z|*.tgz|*.xz)
    # Do what was in the 'then' clause
    ;;
(*) # Do what was in the 'else' clause
    ;;
esac
  • Обратите внимание, что .xz также является схемой сжатия, с которой вы можете столкнуться.
0 голосов
/ 24 декабря 2010

Попробуйте вместо этого:

grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z)$'
...