Perché xargs rimuove le virgolette dall'input?


25

Perché xargs rimuove le virgolette dal testo di input?

Ecco un esempio semplificato:

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

uscite

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

C'è un modo per aggirare questo? (xargs -0 non mi aiuta)


1
xargstratta le virgolette e le barre rovesciate specialmente come parte delle specifiche . Pubblica invece cosa stai cercando di fare xargs.
jw013,

3
xargs -0funziona per me qui ... Perché non ti aiuta?
derobert

Risposte:


10

Dal xargsmanuale:

Se si desidera che un argomento di input contenga spazi vuoti o schede orizzontali, racchiuderlo tra virgolette doppie o apostrofi. Se l'argomento contiene un carattere di virgoletta doppia ( "), è necessario racchiudere l'argomento in apostrofi. Al contrario, se l'argomento contiene un apostrofo ( '), è necessario racchiudere l'argomento tra virgolette doppie. Puoi anche mettere una barra rovesciata ( \) davanti a un personaggio per dire a xargs di ignorare qualsiasi significato speciale che il personaggio può avere (ad esempio, spazi bianchi o virgolette).

Ciò significa che puoi evitare le virgolette se le citazioni sono citate da sole:

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

funzionerà ma echo /Place/=\'http://www.google.com\' | xargs echonon funzionerà.


1
Nulla contro i voti negativi ma un commento sul motivo sarebbe di aiuto :-)
Matteo

3
Cosa succede se si esegue il piping in input? Se ho uno script che genera "/Place/='http://www.google.com'", come posso evitarlo correttamente?
Roger Filmyer,

1
@RogerFilmyer your_script | parallel --shellquote | ...
Ole Tange,

19

se si vuole xargsad ignorare le citazioni uno dei buoni soultion può essere l'uso di xargsbandiera xargs -0

Direttamente dalla pagina Man OPZIONI

OPZIONI -0, --null

Gli elementi di input sono terminati da un carattere nullo anziché da uno spazio bianco e le virgolette e la barra rovesciata non sono speciali (ogni carattere è preso alla lettera). Disabilita la fine della stringa di file, che viene trattata come qualsiasi altro argomento. Utile quando gli elementi di input possono contenere spazi bianchi, virgolette o barre rovesciate. L'opzione GNU find -print0 produce input adatti a questa modalità.

Ho verificato su un sistema GNU che l'impostazione del delimitatore su un valore specifico (come una nuova riga) con l' -dopzione (e non solo -0) causerebbe anche di xargsnon trattare le virgolette ecc. In particolare:

-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

Ho trovato un'altra soluzione nella manpage: specificare esplicitamente il delimitatore come '\ n'. Questo disattiva la gestione speciale per le virgolette:

--delimiter = delim, -d delim

Le voci di input sono terminate dal carattere specificato. Il delimitatore specificato può essere un singolo carattere, una escape di carattere in stile C come \ n o un codice di escape ottale o esadecimale. I codici di escape ottali ed esadecimali sono intesi come per il comando printf. I caratteri multibyte non sono supportati. Durante l'elaborazione dell'input, le virgolette e la barra rovesciata non sono speciali; ogni carattere nell'input è preso alla lettera.

Così,

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

uscite

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

Nota che implica GNU xargso compatibile
Stéphane Chazelas il

Si noti inoltre che impedisce allo spazio e al tab di essere riconosciuti come delimitatori (probabilmente anche nel caso del PO).
Stéphane Chazelas,

Balman ha fornito una soluzione simile (in realtà @imz ) sebbene la tua sia leggermente migliore in quanto evita l'uso ksh93 $'...'dell'operatore di quotazione che non si trova in ogni implementazione della shell.
Stéphane Chazelas,

4

Ho trovato un'altra soluzione qui /programming//a/17468560/1795821 che suggerisce di usare sedper sfuggire alle citazioni.

Per esempio:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.