Как удостовериться, что строка, интерполированная в 'sed' замену, выходит из всех метасимволов

Я не знаком с Администратором сети Ubuntu. Можно всегда отключать то использование:

sudo service network-manager stop

Затем использование:

sudo iwlist wlan0 scanning | grep ESSID

Видеть, можно ли даже видеть сеть.

Если так, и Вы используете wpa2, необходимо будет сделать несколько вещей. Сначала генерируйте пару ключ/значение, которую wpa_supplicant будет использовать для подключения:

sudo wpa_passphrase "mywireless_ssid" "secretpassphrase" >> /etc/wpa_supplicant.conf

Затем, избавьтесь от любого dhcp сервиса (на всякий случай, он работает),

sudo pkill dhcpcd

Наконец, попытайтесь соединиться:

wpa_supplicant -Dwext -i wlan0 -c /etc/wpa_supplicant.conf &

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

23
13.05.2014, 02:12
1 ответ

Для экранирования переменных, которые будут использоваться в левой и правой части s в sed (здесь $ lhs и $ rhs соответственно), вы должны сделать:

escaped_lhs=$(printf '%s\n' "$lhs" | sed 's:[][\/.^$*]:\\&:g')
escaped_rhs=$(printf '%s\n' "$rhs" | sed 's:[\/&]:\\&:g;$!s/$/\\/')

sed "s/$escaped_lhs/$escaped_rhs/"

Обратите внимание, что $ lhs не может содержать символ новой строки.

То есть на LHS экранировать все операторы регулярного выражения (] [. ^ $ * ), сам экранирующий символ ( \ ) и разделитель ( / ).

На RHS вам нужно только экранировать и , разделитель, обратную косую черту и символ новой строки (что вы делаете, вставляя обратную косую черту в конце каждой строки, кроме последней ( $! s / $ / \\ / )).

Предполагается, что вы используете / в качестве разделителя в ваших командах sed s и что вы не включаете расширенные RE с -r (GNU sed / ssed / ast / busybox sed ) или -E ( BSD, ast , недавний GNU, недавний busybox) или PCRE с -R ( ssed ) или расширенные RE с -A / -X ( ast ), которые все имеют дополнительные операторы RE.

Несколько основных правил при работе с произвольными данными:

  • Не используйте echo
  • цитируйте ваши переменные
  • учитывайте влияние языкового стандарта (особенно его набора символов: важно, чтобы экранирующие команды sed выполняются в той же локали, что и команда sed , с использованием экранированных строк (и с той же командой sed ) например)
  • не забывайте о символе новой строки (здесь вы можете проверить, содержит ли $ lhs какой-либо символ, и принять меры).

Другой вариант - использовать perl вместо sed , передавать строки в среде и использовать \ Q / \ E perl операторы регулярного выражения для буквального восприятия строк:

A="$lhs" B="$rhs" perl -pe 's/\Q$ENV{A}\E/$ENV{B}/g'

perl (по умолчанию) не зависит от набора символов языкового стандарта, поскольку в приведенном выше примере он рассматривает строки только как массивы байтов, не заботясь о какие символы (если есть) они могут представлять для пользователя. С sed вы можете добиться того же, установив локаль на C с помощью LC_ALL = C для всех команд sed (хотя это будет также влияют на язык сообщений об ошибках, если таковые имеются).

25
27.01.2020, 19:42

Теги

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