Warum entfernt xargs Anführungszeichen aus der Eingabe?


24

Warum werden in xargs Anführungszeichen aus dem Eingabetext entfernt?

Hier ist ein vereinfachtes Beispiel:

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

Ausgänge

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

Gibt es eine Möglichkeit, dies zu umgehen? (xargs -0 hilft mir nicht)


1
xargsbehandelt Anführungszeichen und Backslashes speziell als Teil der Spezifikation . Veröffentlichen Sie xargsstattdessen, womit Sie zu tun versuchen .
jw013

3
xargs -0funktioniert bei mir hier ... Warum hilft es dir nicht?
Derobert

Antworten:


10

Aus dem xargsHandbuch:

Wenn ein Eingabeargument Leerzeichen oder horizontale Tabulatoren enthalten soll, schließen Sie es in doppelte Anführungszeichen oder Apostrophe ein. Wenn das Argument ein doppeltes Anführungszeichen ( ") enthält, müssen Sie das Argument in Apostrophe setzen. Umgekehrt 'müssen Sie das Argument in doppelte Anführungszeichen setzen , wenn das Argument ein Apostroph ( ) enthält . Sie können \einem Zeichen auch einen Backslash ( ) voranstellen, um xargs anzuweisen, eine bestimmte Bedeutung des Zeichens zu ignorieren (z. B. Leerzeichen oder Anführungszeichen).

Dies bedeutet, dass Sie Anführungszeichen umgehen können, wenn die Anführungszeichen selbst in Anführungszeichen stehen:

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

wird funktionieren, aber echo /Place/=\'http://www.google.com\' | xargs echonicht.


1
Nichts gegen Abstimmungen, aber ein Kommentar zum Grund würde helfen :-)
Matteo

3
Was ist, wenn Sie Input einspeisen? "/Place/='http://www.google.com'"Wie kann ich ein ausgegebenes Skript ordnungsgemäß umgehen?
Roger Filmyer

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

19

wenn Sie wollen , xargsum Anführungszeichen ignorieren eine der guten soultion kann die Verwendung sein xargsFlag xargs -0

Direkt aus der Manpage OPTIONS

OPTIONEN -0, --keine

Eingabeelemente werden durch ein Nullzeichen anstelle von Leerzeichen abgeschlossen, und die Anführungszeichen und der Backslash sind keine besonderen Zeichen (jedes Zeichen wird wörtlich genommen). Deaktiviert das Ende der Dateizeichenfolge, die wie jedes andere Argument behandelt wird. Nützlich, wenn Eingabeelemente Leerzeichen, Anführungszeichen oder umgekehrte Schrägstriche enthalten können. Die GNU-Option find -print0 erzeugt Eingaben, die für diesen Modus geeignet sind.

Ich habe auf einem GNU-System überprüft, dass das Setzen des Begrenzers auf einen bestimmten Wert (wie eine neue Zeile) mit der -dOption (und nicht nur -0) auch dazu führen würde, dass xargsdie Anführungszeichen usw. nicht speziell behandelt werden:

-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

In der Manpage wurde eine andere Lösung gefunden: Geben Sie das Trennzeichen explizit als '\ n' an. Dies deaktiviert die spezielle Behandlung von Anführungszeichen:

--delimiter = delim, -d delim

Eingabeelemente werden mit dem angegebenen Zeichen beendet. Das angegebene Trennzeichen kann ein einzelnes Zeichen, ein Escape-Zeichen im C-Stil wie \ n oder ein Escape-Code in Oktal- oder Hexadezimalform sein. Oktale und hexadezimale Escape-Codes werden wie beim Befehl printf verstanden. Multibyte-Zeichen werden nicht unterstützt. Bei der Verarbeitung der Eingabe sind Anführungszeichen und Backslash keine Besonderheiten. Jedes Zeichen in der Eingabe wird wörtlich genommen.

So,

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

Ausgänge

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

Beachten Sie, dass es GNU xargsoder kompatibel impliziert
Stéphane Chazelas

Beachten Sie auch, dass Leerzeichen und Tabulatoren nicht als Begrenzer erkannt werden (wahrscheinlich auch im Fall des OP).
Stéphane Chazelas

Balman gab eine ähnliche Lösung ( na ja, eigentlich @imz ), obwohl Ihre etwas besser darin ist, dass die Verwendung des ksh93 $'...'Quoting-Operators vermieden wird, der nicht in jeder Shell-Implementierung zu finden ist.
Stéphane Chazelas

4

Ich fand eine andere Lösung hier /programming//a/17468560/1795821 , die schlägt mit sedAnführungszeichen zu entkommen.

Beispielsweise:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.