Чому xargs знімає цитати з вхідних даних?


25

Чому xargs знімає лапки з вхідного тексту?

Ось спрощений приклад:

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

виходи

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

Чи є спосіб вирішити це? (xargs -0 мені не допомагає)


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не буде.


1
Нічого проти проти голосів, але коментар про причину не допоможе :-)
Маттео,

3
Що робити, якщо ви працюєте з вхідними даними? Якщо у мене є сценарій, який видає "/Place/='http://www.google.com'", як я можу правильно його уникнути?
Roger Filmyer

1
@RogerFilmyer your_script | паралельно - цитата | ...
Оле Танге

19

якщо ви хочете , xargsщоб ігнорувати цитує одну з хорошою soultion може бути використання xargsпрапора xargs -0

Прямо з сторінки Man OPTIONS

ВАРІАНТИ -0, --нуло

Елементи введення закінчуються нульовим символом замість пробілу, а лапки та зворотна риса не є спеціальними (кожен символ приймається буквально). Вимикає кінець рядка файлу, який трактується як і будь-який інший аргумент. Корисно, коли елементи введення можуть містити пробіл, лапки або зворотні риси. Опція 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$ 


7

Я знайшов інше рішення на сторінці вручну: чітко вказати роздільник як "\ n". Це вимикає спеціальну обробку котирувань:

--delimiter = делім, -d delim

Елементи введення закінчуються вказаним символом. Зазначений роздільник може бути одним символом, символом втечі символу С, таким як \ n, або восьмий або шістнадцятковий код втечі. Октальні та шістнадцяткові коди втечі розуміються як для команди printf. Багатобайтові символи не підтримуються. При обробці вхідних даних котирування та зворотна риса не є особливими; кожен символ у введенні приймається буквально.

Так,

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

виходи

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

Зауважте, що він передбачає GNU xargsабо сумісний
Stéphane Chazelas

Також зауважте, що це також зупиняє простір та вкладку від розпізнавання (можливо, так само, як і у випадку з ОП).
Стефан Шазелас

Бальман дав подібне рішення (ну насправді @imz ), хоча ваш дещо кращий, оскільки він уникає використання ksh93 $'...'оператора цитування, який не знайдеться в кожній реалізації оболонки.
Стефан Шазелас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.