Почему xargs удаляет кавычки из ввода?

25

Почему xargs удаляет кавычки из входного текста?

Вот упрощенный пример:

echo "/Place/='http://www.google.com'" | xargs echo

выходы

/Place/=http://www.google.com

Есть ли способ обойти это? (xargs -0 мне не помогает)

ddario
источник
1
xargsрассматривает кавычки и обратную косую черту специально как часть спецификации . Опубликуйте, что вы пытаетесь сделать xargsвместо этого.
jw013
3
xargs -0у меня здесь работает ... Почему это не поможет?
Дероберт

Ответы:

10

Из xargsруководства:

Если вы хотите, чтобы входной аргумент содержал пробелы или горизонтальные табуляции, заключите его в двойные кавычки или апострофы. Если аргумент содержит символ двойной кавычки ( "), вы должны заключить аргумент в апострофы. И наоборот, если аргумент содержит апостроф ( '), вы должны заключить аргумент в двойные кавычки. Вы также можете поместить обратную косую черту ( \) перед символом, чтобы xargs игнорировал любое специальное значение, которое может иметь символ (например, символы пробела или кавычки).

Это означает, что вы можете избежать кавычек, если сами кавычки заключены в кавычки:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

будет работать, но echo /Place/=\'http://www.google.com\' | xargs echoне будет.

Matteo
источник
1
Ничто против отрицательных голосов, но комментарий по причине поможет :-)
Matteo
3
Что если вы вводите данные? Если у меня есть сценарий, который выводит "/Place/='http://www.google.com'", как я могу правильно избежать его?
Роджер Филмиер,
1
@RogerFilmyer your_script | параллель --shellquote | ...
Оле Танге
19

если вы хотите , xargsчтобы игнорировать цитирует одну из хорошей soultion может быть использование xargsфлага xargs -0

Прямо со страницы Man

ВАРИАНТЫ -0, --null

Входные элементы заканчиваются нулевым символом вместо пробела, и кавычки и обратный слеш не являются специальными (каждый символ воспринимается буквально). Отключает конец строки файла, который обрабатывается как любой другой аргумент. Полезно, когда элементы ввода могут содержать пробелы, кавычки или обратную косую черту. Опция GNU find -print0 производит ввод, подходящий для этого режима.

Я проверил в системе GNU, что установка разделителя на определенное значение (например, на новую строку) с -dпараметром (и не только -0) также приведет xargsк тому, что не будет обрабатываться кавычки и т. Д. Специально:

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 
Балман Рават
источник
8

Вместо этого вы можете использовать GNU Parallel:

$ echo "/Place/='http://www.google.com'" | parallel echo
/Place/='http://www.google.com'

Тогда вам не нужно делать цитаты самостоятельно.

Подробнее: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Оле Танге
источник
7

Я нашел другое решение в man-странице: явно укажите разделитель как '\ n'. Это отключает специальную обработку для кавычек:

--delimiter = delim, -d delim

Элементы ввода завершаются указанным символом. Указанный разделитель может быть одним символом, escape-символом в стиле C, таким как \ n, или восьмеричным или шестнадцатеричным escape-кодом. Восьмеричные и шестнадцатеричные escape-коды понимаются как для команды printf. Многобайтовые символы не поддерживаются. При обработке ввода кавычки и обратный слеш не являются специальными; каждый символ на входе воспринимается буквально.

Так,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

выходы

/Place/='http://www.google.com'
fungusakafungus
источник
Обратите внимание, что это подразумевает GNU xargsили совместимость
Стефан
Также обратите внимание, что это также мешает распознавать пробелы и символы табуляции как разделители (вероятно, так же, как и в случае с OP).
Стефан
Бальман дал аналогичное решение (ну, на самом деле, @imz ), хотя ваше решение несколько лучше, поскольку оно позволяет избежать использования ksh93 $'...'оператора цитирования, который встречается не в каждой реализации оболочки.
Стефан
4

Я нашел другое решение здесь /programming//a/17468560/1795821, которое предлагает использовать sedдля кавычек.

Например:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
Кристофор Карл
источник