Wget для установки марионеток

В системах, отличных от GNU, следующее объясняет, почему \ S терпит неудачу:

\ S часть PCRE (Perl-совместимые регулярные выражения). Он не является частью BRE (базовых регулярных выражений) или ERE (расширенных регулярных выражений) , используемых в оболочках.

Оператор bash = ~ внутри теста с двойными скобками [[] использует ERE.

Единственными символами со специальным значением в ERE (в отличие от любого обычного символа) являются . [\ () * +? {| ^ $ . Специальных S не существует. Вам необходимо построить регулярное выражение из более основных элементов:

regex='^b[^[:space:]]+[a-z]$'

Где выражение в скобках [^ [: space:]] эквивалентно выражениям \ S PCRE :

По умолчанию \ s символы теперь HT (9), LF (10), VT (11), FF (12), CR (13) и пробел (32). .

Тест будет выглядеть следующим образом:

var='big'            regex='^b[^[:space:]]+[a-z]$'

[[ $var =~ $regex ]] && echo "$var" || echo 'none'

Однако приведенный выше код будет соответствовать, например, bißß . Поскольку диапазон [az] будет включать символы, отличные от abcdefghijklmnopqrstuvwxyz , если выбран языковой стандарт (UNICODE). Чтобы избежать такой проблемы, используйте:

var='bißß'            regex='^b[^[:space:]]+[a-z]$'

( LC_ALL=C;
  [[ $var =~ $regex ]]; echo "$var" || echo 'none'
)

Пожалуйста, будьте знайте, что код будет соответствовать символам только в списке: abcdefghijklmnopqrstuvwxyz в последней позиции символа, но все равно будет соответствовать многим другим в середине: например, Бег .


Тем не менее, это использование LC_ALL = C повлияет на другой диапазон регулярных выражений: [[: space:]] будет соответствовать пробелам только языкового стандарта C.

Чтобы решить все проблемы, нам нужно сохранить каждое регулярное выражение отдельно:

reg1=[[:space:]]   reg2='^b.*[a-z]$'           out=none

if                 [[ $var =~ $reg1 ]]  ; then out=none
elif   ( LC_ALL=C; [[ $var =~ $reg2 ]] ); then out="$var"
fi
printf '%6.8s\t|' "$out"

Что читается как:

  • Если вход (var) не имеет пробелов (в текущей локали), тогда
  • проверьте, что он запускается с b и оканчивается на az (в локали C).

Обратите внимание, что оба теста выполняются на положительных диапазонах (в отличие от диапазона «не»). Причина в том, что отрицание пары символов открывает намного больше возможных совпадений. UNICODE v8 уже имеет 120 737 символов. Если диапазон отрицает 17 символов, то он принимает 120720 других возможных символов, которые могут включать много непечатаемых управляющих символов.

Рекомендуется ограничить диапазон символов, который могут иметь средние символы (да, это не будут пробелы, но может быть что-то еще).

0
07.10.2018, 13:09
1 ответ

Вы пробовали использовать кавычки в URL?

У меня эта команда начинает загрузку 472MB puppet -enterprise -2018.1.4 -el -7 -x86 _64.tar.gz

wget -O puppet-enterprise-2018.1.4-el-7-x86_64.tar.gz 'https://pm.puppet.com/cgi-bin/download.cgi?arch=x86_64&dist=el&rel=7&ver=latest'

Если это не поможет, возможно, нужны какие-то файлы cookie. Если у вас есть доступ к машине по SSH, загрузите файл на локальную машину и используйте scp, чтобы скопировать его на удаленную машину.

1
28.01.2020, 02:42

Теги

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