Как эта 'sed' замена управляет с большим количеством из работа знаков?

Может любой объяснять как это sed работы команды?

sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
8
задан 4 October 2017 в 23:27

3 ответа

That’s красота sed лет, это применяет свои парадигмы к себе... После команды (такой как s или tr или ничто), следующий символ считают разделителем.

необходимо принять решение мудро избежать интерференции с оболочкой и самой командой, и сохранить вещь читаемой, но it’s совершенно допустимый для записи чего-то столь же неприятного как:

echo 'arrival' | sed srarbrg

... и добираются brrivbl в результате, который является тем, что Вы ожидаете. Можно весело провести время, делая это действительно загадочным, такой как в:

echo 'arrival' | sed s\fa\fb\fg   # \f is form feed, chr(12)

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

Просто помнят, что цель состоит в том, чтобы сделать вещи легче, не более загадочный.

3
ответ дан 23 November 2019 в 05:21

В sed команды замены обычно пишутся как s/pattern/replacement/options. Однако не необходимо использовать / - можно использовать другие символы, если это удобно, таким образом, это могло быть s@pattern@replacement@options или s:foo:bar:g. s@+@ @g похож s/+/ /g - замените все + с пробелами. Так же s@%@\\x@g замены все % с \x (единственная обратная косая черта является символом ESC в sed, таким образом, Вам нужно два для получения фактической обратной косой черты).

Строка как foo+%2Fbar затем станет foo \x2Fbar. printf "%b" развернет оставленные из обратной косой черты последовательности как \x2F (символ ASCII, шестнадцатеричное значение которого 2F, который является /) наконец дать Вам foo /bar.

15
ответ дан 23 November 2019 в 05:21

Команда Вы просите о декодирование +es и % последовательности от URL не просто a sed команда, это - конвейер, который обрабатывает вход с sed, затем каналы это к xargs для последующей обработки. Сначала позволяет взгляду на sed команда:

sed 's@+@ @g;s@%@\\x@g'

Можно быть более приученными к наблюдению его с / вместо @ как разделитель, который, возможно, легко был сделан здесь без сложности с тех пор / не появляется ни в шаблонов поиска, ни в любого из текстов замены. Эта команда эквивалентна:

sed 's/+/ /g;s/%/\\x/g'

Как /, @ совершенно хороший знак пунктуации для sed.

На каждой строке входа:

  1. s@+@ @g (s/+/ /g) замены (s) случаи + с пространством. Это влияет на все +es на строке (g), не только первый.

  2. ; заканчивает действие ("команда") и позволяет Вам указывать другой в том же "сценарии".

  3. s@%@\\x@g (s/%/\\x/g) замены (s) случаи % с \x. Как прежде, это действует на все, а не просто первую из каждой строки (g).

    В \\x \\ представляет всего один \ потому что \ имеет особое значение к sed. Его особое значение на самом деле как символ, который Вы используете для устранения особого значения другого символа, который прибывает после него, который иначе имел бы особое значение. Таким образом, этого нужно оставить как \\.


Теперь давайте посмотрим xargs команда, цель которой состоит в том, чтобы работать printf.

xargs командные строки конструкций. Если Вы работаете xargs command..., где command... один или несколько слово, xargs выполнения command... с дополнительными параметрами командной строки, считанными из его входа. В этом случае, вход к xargs вывод sed, из-за канала (|). Обычно xargs интерпретирует любой пробел в его входе, чтобы означать, что текст прежде и после того, как он составит отдельные аргументы, но -0 опция заставляет его разделить аргументы при случаях нулевого символа вместо этого.

В надлежащем использовании Вашей команды нулевой символ не появится и xargs будет работать printf %b со всего одним дополнительным параметром командной строки, выводом sed команда. Таким образом, в то время как не эквивалентный в целом, в этом случае целый конвейер, возможно, вместо этого был записан как эта замена команды использования вместо xargs:

printf '%b\n' "$(sed 's/+/ /g;s/%/\\x/g')"

Что касается какой printf предназначается, чтобы сделать здесь, как muru говорит %b спецификатор формата использует и печатает аргумент (как %s) но Escape обратной косой черты причин - вида sed команда на левой стороне канала была записана для генерации - чтобы быть переведенной в символы, которые они представляют.

Предположим, что я выполняю ту команду и передачу http://foldoc.org/debugging%20by%20printf как введено. Я добираюсь http://foldoc.org/debugging by printf как произведено, потому что %20 последовательности переводятся в пробелы.

10
ответ дан 23 November 2019 в 05:21

Другие вопросы по тегам:

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