Variável imprimiu o valor esperado, mas na verdade seu valor é diferente

0

A seguinte sintaxe usada para capturar a palavra entre <Name> in .xml file. Eu também uso xargs para remover espaços.

$> var=' find /tmp -name '*.xml' -exec sed -n 's/<Name>\([^<]*\)<\/Name>//p' {} +  |  xargs '
$> echo $var
TOPIC
$>

Até agora, parece estar tudo bem. Mas printf mostra outra coisa:

$> printf "%q\n" "$var"
$'TOPIC\r'
$>

Vamos detalhar:

$> [[ TOPIC == $var ]] && echo they are equal
$>

Não "são iguais" já impressos.

Mas quando nós ecoamos $var nós recebemos:

$> echo $var
TOPIC
$>

A grande questão é: como remover os caracteres extras ( $ , \r ) da variável?

$'TOPIC\r'
    
por enodmilvado 17.01.2018 / 13:00

1 resposta

1

$ 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).

    
por 17.01.2018 / 14:05