$
steht weder in der Variable noch im Literal \r
. Sie sind mit dem Ausgang hinzugefügt, weil Sie gesagt, auf printf
diese Weise zu formatieren: %q
. Das eigentliche zusätzliche Zeichen ist "Wagenrücklauf", Code 0x0D
, welche Escape-Sequenz ist \r
.
Die Wurzel Ihres Problems ist, dass Ihre .xml
Dateien anscheinend CR + LF-Zeilenenden aus der DOS / Windows-Welt verwenden. Siehe diesen Vergleich bei Wikipedia.
Das Dokument Extensible Markup Language (XML) 1.0 (Fünfte Ausgabe) sagt:
Um die Aufgaben von Anwendungen zu vereinfachen, muss sich der XML-Prozessor so verhalten, als ob er alle Zeilenumbrüche in externen geparsten Entitäten (einschließlich der Dokumententität) bei der Eingabe normalisiert hat, bevor er analysiert wird, indem er sowohl die aus zwei Zeichen bestehende Sequenz
#xD #xA
als auch jede andere, die#xD
nicht folgt, übersetzt#xA
zu einem einzelnen#xA
Zeichen.
Hier #xD
bezeichnet CR, #xA
LF.
In Ihrem Fall die ganze find … | xargs
Aussage ist der XML - Prozessor (wir Probleme wie stellen diese beiseite). Wenn Sie die Spezifikation vollständig einhalten möchten, müssen Sie jede .xml
Datei dos2unix
an erster Stelle durchgeben .
Da das eigentliche Problem jedoch mit dem Inhalt der Variablen zusammenhängt, kann dies in Ihrem Fall ausreichend sein:
var=`find … | dos2unix | xargs`
Wenn Sie nicht haben dos2unix
, tr -d '\r'
würde in diesem Zusammenhang als Ersatz arbeiten (danke @GordonDavisson für diesen Hinweis).