Кто-нибудь может объяснить, как sed
работает эта команда?
sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
sed
этом пути! :)
Кто-нибудь может объяснить, как sed
работает эта команда?
sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
sed
этом пути! :)
Ответы:
В sed команды замены обычно записываются как s/pattern/replacement/options
. Тем не менее, это не обязательно использовать /
- вы можете использовать другие символы, если это удобно, так что это может быть s@pattern@replacement@options
или s:foo:bar:g
. s@+@ @g
это как s/+/ /g
- заменить все +
пробелы. Аналогичным образом s@%@\\x@g
заменяет все %
на \x
(одна обратная косая черта является escape-символом в sed, поэтому для получения реальной обратной косой черты нужно два).
Строка как foo+%2Fbar
тогда станет foo \x2Fbar
. printf "%b"
развернет последовательности, экранированные обратной косой чертой, например \x2F
(символ ASCII, шестнадцатеричное значение которого равно 2F /
), чтобы, наконец, дать вам foo /bar
.
Команда, которую вы запрашиваете для декодирования +
es и %
sequence из URL, это не просто sed
команда, это конвейер, который обрабатывает ввод sed
, а затем передает его xargs
для дальнейшей обработки. Сначала давайте посмотрим на sed
команду:
sed 's@+@ @g;s@%@\\x@g'
Возможно, вы более привыкли видеть его с разделителем, /
а не @
в качестве разделителя, что легко можно было бы сделать здесь без осложнений, поскольку оно не /
встречается ни в шаблонах поиска, ни в текстах замены. Эта команда эквивалентна:
sed 's/+/ /g;s/%/\\x/g'
Мол /
, @
это очень хороший знак пунктуации для sed
.
На каждой строке ввода:
s@+@ @g
( s/+/ /g
) подставляет ( s
) вхождения +
с пробелом. Это влияет на все +
es в строке ( g
), а не только на первый.
;
завершает действие («команда») и позволяет вам указать другое в том же «сценарии».
s@%@\\x@g
( s/%/\\x/g
) подстановки ( s
) вхождения %
с \x
. Как и прежде, он действует на все, а не только на первую строку каждой строки ( g
).
В представляет только один , потому что имеет особое значение для . Его особое значение на самом деле заключается в том, что вы используете символ, чтобы убрать особое значение другого символа, который следует за ним, который в противном случае имел бы особое значение. Так что надо сбежать как .\\x
\\
\
\
sed
\\
Теперь давайте посмотрим на xargs
команду, целью которой является запуск printf
.
xargs
строит командные строки. Если вы запускаете , где находится одно или несколько слов, запускается с дополнительными аргументами командной строки, считанными из его ввода. В этом случае входные данные являются выходными данными из-за pipe ( ). Обычно интерпретирует любой пробел в своем входном значении, чтобы обозначить, что текст до и после него представляет собой отдельные аргументы, но опция заставляет вместо этого разделять аргументы при появлении нулевого символа .xargs command...
command...
xargs
command...
xargs
sed
|
xargs
-0
При предполагаемом использовании вашей команды нулевой символ не будет отображаться и xargs
будет выполняться printf %b
только с одним дополнительным аргументом командной строки, выводом sed
команды. Таким образом, хотя в общем случае это не эквивалентно, в этом случае весь конвейер мог бы быть написан так, используя подстановку команд вместо xargs
:
printf '%b\n' "$(sed 's/+/ /g;s/%/\\x/g')"
Что же касается того, что printf
предполагается сделать здесь, в Муре говорит о %b
формате спецификатор потребляет и печатает аргумент (например %s
) , но вызывает обратный слеш - от сортировки по sed
команде на левой стороне трубы была написано для создания - быть переведено в символы, которые они представляют .
Предположим, я запускаю эту команду и передаю в http://foldoc.org/debugging%20by%20printf
качестве ввода. Я получаю в http://foldoc.org/debugging by printf
качестве вывода, потому что %20
последовательности переводятся в пробелы.
Это красота sed
, она применяет свои парадигмы к себе ... После команды (например, s
или , tr
или ничего), то следующий символ считается разделителем.
Вы должны сделать правильный выбор, чтобы избежать вмешательства в оболочку и саму команду, и сохранить ее читабельной, но совершенно правильно написать что-то столь ужасное, как:
echo 'arrival' | sed srarbrg
... и получить brrivbl
в результате, что вы ожидаете. Вы можете весело провести время, сделав это действительно загадочным, например:
echo 'arrival' | sed s\fa\fb\fg # \f is form feed, chr(12)
Обычное использование - использовать косую черту в качестве разделителя, но когда ваше выражение содержит разделитель, вам будет проще понять, что это за цель. Ваш разделитель может быть любым в диапазоне ASCII8 (многобайтовые разделители, например, £
вызывают ошибку).
Просто помните, что цель состоит в том, чтобы сделать вещи проще, а не более загадочными.
sed "snack is an apple or something" <<< "I sed your snack is an apple or something"
sed
команды в качестве тизеров мозга, насколько это отвратительно?