Строка может быть сопоставлена несколькими способами (от простого к более сложному):
В виде статической строки (Предположим, что var='Hello World!'):
оболочка[ "$var" = "Hello World!" ] && echo yes
группаecho "$var" | grep -F "Hello"
башgrep -F "Hello" <<<"$var"
Как шарик:
оболочкаecho./*
#список все файлы в pwd.
оболочкаcase $var in (*Worl*) echo yes;; (*) echo no;; esac
баш[[ "$var" == *"Worl"* ]] && echo yes
Существуют базовые и расширенные подстановки. В примере case
используются базовые подстановки. В примере bash [[
используются расширенные подстановочные знаки. Первое сопоставление файлов может быть базовым или расширенным в какой-либо оболочке, например параметром extglob
в bash. Оба в данном случае идентичны. Grep не может использовать globs.
Звездочка в глобусе означает нечто иное, чем звездочка в регулярном выражении:
глобус* matches any number (including none) of
любые символы .
регулярное выражение* matches any number (including none) of the
предшествующий элемент .
В качестве базового регулярного выражения (BRE):
sedecho "$var" | sed 's/W.*d//'
#print :Здравствуйте!
grepgrep -o 'W.*d' <<<"$var"
#print World !
В (базовых )оболочках или awk нет BRE.
Расширенные регулярные выражения (ERE):
bash[[ "$var" =~ (H.*l) ]]
#совпадение :Hello World
sedecho "$var" | sed -E 's/(d|o)//g'
#print :Hell Wrl!
awkawk '/W.*d/{print $1}' <<<"$var"
#печать :Привет
grepgrep -oE 'H.*l' <<<"$var"
#печать :Hello World
Perl-совместимые регулярные выражения:
grepgrep -oP 'H.*?l
#печать :Хел
Только в PCRE *?
имеет определенное синтаксическое значение.
Это делает звездочку ленивой (нежадной):Лень вместо жадности .
$ grep -oP 'e.*l' <<<"$var"
ello Worl
$ grep -oP 'e.*?l' <<<"$var"
el
Это только верхушка айсберга, есть жадные, ленивые и послушные или притяжательные . Существуют также просмотр вперед и назад , но они не применяются к звездочке *
.
Существует альтернатива, позволяющая получить тот же эффект, что и не -жадное регулярное выражение:
$ grep -o 'e[^o]*o' <<<"$var"
ello
Идея очень проста :не используйте точку .
, инвертируйте следующий символ для соответствия [^o]
. С веб-тегом:
$ grep -o '<[^>]*>' <<<''
Вышеизложенное должно полностью прояснить все комментарии @Bob 3. Перефразируя:
.*
жадный .*?
нет. Каковы различия в использовании. ? против.. ?
.*?
допустимо только в синтаксисе PCRE. .*
более портативный. [^a]*
Что лучше и при каких обстоятельствах? Пожалуйста, приведите примеры.
Лучше? Это зависит от цели. Лучшего нет, каждый полезен для разных целей. Я привел несколько примеров выше. Вам нужно больше?
Когда вы запускаете свой скрипт с bash
в терминале, bash получает ваш стандартный ввод(у вас есть только один )с клавиатуры.
keyboard -> script
Когда вы передаете сценарий bash
по каналу, этот канал становится стандартным вводом . Так что ваша проблема не связана с wget, если вы сделали это:
cat test.sh | bash -x
у вас будет такое же поведение, потому что теперь ввод поступает из конвейера, а не с клавиатуры. И bash
скрипты наследуют этот стандартный ввод .
pipe -> script
Как только данные в канале заканчиваются, то же самое происходит с bash и скриптом.
Чтобы решить эту проблему, загрузите, а затем запустите (вам не нужен -O
, но я стараюсь сохранить вашу линию, поскольку -это ). Примерно так:
$ wget -qO test.sh 'https://testserver/pub/test.sh' && bash test.sh