Почему xargs вырезает цитаты из ввода?

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

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

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

выходы

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

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

4 Solutions collect form web for “Почему xargs вырезает цитаты из ввода?”

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

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

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

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

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

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

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

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

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

если вы хотите, чтобы xargs игнорировали кавычки, одним из хороших существ может быть использование xargs flag xargs -0

Непосредственно из Man page OPTIONS

ОПЦИИ -0, –null

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

Я проверил в системе GNU, что установка разделителя на определенное значение (например, xargs ) с опцией -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$ 

Я нашел другое решение здесь https://stackoverflow.com/a/17468560/1795821, в котором предлагается использовать sed для возврата котировок.

Например: sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo /Place/='http://www.google.com' sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo /Place/='http://www.google.com'

  • Как мне получить xargs, чтобы показать мне строки команд, которые он генерирует, не запуская их?
  • Пропустить входной файл через трубу в качестве аргумента?
  • Невозможно запросить пользователя с помощью опции rm bultin prompt -i с помощью xargs и найти
  • Как я удаляю все файлы в каталоге с конкретными расширениями, за исключением последних 5 из них
  • Переформатирование большого количества XML-файлов
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Трубопровод нескольких строк в сценарии bash
  • Правильный синтаксис для использования awk в сочетании с другой командой внутри xargs sh -c
  • как суммировать вывод awk или другого выражения с помощью xargs
  • Что делает «-t» в команде mv? Пример ниже
  • Почему xargs -n 1 настолько медленный для длинных строк
  • Linux и Unix - лучшая ОС в мире.