Команда чтения работает локально и терпит неудачу с wget

Строка может быть сопоставлена ​​несколькими способами (от простого к более сложному):

  1. В виде статической строки (Предположим, что var='Hello World!'):

    [ "$var" = "Hello World!" ] && echo yes
    echo "$var" | grep -F "Hello"
    grep -F "Hello" <<<"$var"

  2. Как шарик:

    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предшествующий элемент .

  3. В качестве базового регулярного выражения (BRE):

    echo "$var" | sed 's/W.*d//'#print :Здравствуйте!
    grep -o 'W.*d' <<<"$var"#print World !

    В (базовых )оболочках или awk нет BRE.

  4. Расширенные регулярные выражения (ERE):

    [[ "$var" =~ (H.*l) ]]#совпадение :Hello World
    echo "$var" | sed -E 's/(d|o)//g'#print :Hell Wrl!
    awk '/W.*d/{print $1}' <<<"$var"#печать :Привет
    grep -oE 'H.*l' <<<"$var"#печать :Hello World

  5. Perl-совместимые регулярные выражения:

    grep -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.
  • В PCRE :a ? изменить квантификатор *. .*жадный .*?нет.

Вопросы

  • Каковы различия в использовании. ? против.. ?

    • Значение .*?допустимо только в синтаксисе PCRE.
    • A .*более портативный.
    • Тот же эффект, что и при не-жадном сопоставлении, можно получить, заменив точку диапазоном отрицательных символов:[^a]*
  • Что лучше и при каких обстоятельствах? Пожалуйста, приведите примеры.
    Лучше? Это зависит от цели. Лучшего нет, каждый полезен для разных целей. Я привел несколько примеров выше. Вам нужно больше?

0
17.05.2020, 21:20
1 ответ

Когда вы запускаете свой скрипт с 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
1
28.04.2021, 23:14

Теги

Похожие вопросы