$
não está na variável nem o literal \r
. Eles são adicionados à saída porque você disse printf
para formatar desta maneira: %q
. O caractere extra real é "retorno de carro", código 0x0D
, que seqüência de escape é \r
.
A raiz do seu problema é que seus arquivos .xml
parecem usar terminais de linha CR + LF do mundo DOS / Windows. Veja esta comparação na Wikipedia.
O documento Extensible Markup Language (XML) 1.0 (Quinta Edição) diz:
To simplify the tasks of applications, the XML processor must behave as if it normalized all line breaks in external parsed entities (including the document entity) on input, before parsing, by translating both the two-character sequence
#xD #xA
and any#xD
that is not followed by#xA
to a single#xA
character.
Aqui #xD
denota CR, #xA
denota LF.
No seu caso, a declaração find … | xargs
inteira é o seu processador XML (vamos colocar problemas como isso de lado). Se você quiser cumprir totalmente com a especificação, deverá passar todos os arquivos .xml
através de dos2unix
em primeiro lugar.
Mas, como o verdadeiro problema está no conteúdo da variável, isso pode ser suficiente no seu caso:
var='find … | dos2unix | xargs'
Se você não tiver dos2unix
, tr -d '\r'
funcionaria como um substituto neste contexto (obrigado @GordonDavisson por apontar isso).