La variabile ha stampato il valore previsto ma in realtà il suo valore è diverso


0

La seguente sintassi usata per catturare la parola tra <Name> nel .xml file. Io uso anche xargs rimuovere eventuali spazi.

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

Fino ad ora sembra essere OK. Ma printf mostra qualcos'altro:

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

Esaminiamo:

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

No "sono uguali" mai stampati.

Ma quando riecheggiamo $var noi abbiamo:

$> echo $var
TOPIC
$>

La domanda GRANDE GRANDE è: come rimuovere i caratteri extra ( $, \r ) dalla variabile?

$'TOPIC\r'

Risposte:


1

$ non è nella variabile, né nel letterale \r. Vengono aggiunti all'output perché l'hai detto printf per formattare in questo modo: %q. Il vero carattere extra è "carriage return", codice 0x0D, quale sequenza di fuga è \r.

La radice del tuo problema è tua .xml i file sembrano utilizzare le terminazioni di linea CR + LF dal mondo DOS / Windows. Vedere questo confronto su Wikipedia.

Il documento Extensible Markup Language (XML) 1.0 (Fifth Edition) dice:

Per semplificare i compiti delle applicazioni, il processore XML deve comportarsi come se normalizzasse tutte le interruzioni di riga in entità esterne analizzate (inclusa l'entità documento) sull'input, prima dell'analisi, traducendo sia la sequenza di due caratteri #xD #xA e qualsiasi #xD non è seguito da #xA a un singolo #xA personaggio.

Qui #xD denota CR, #xA denota LF.

Nel tuo caso il tutto find … | xargs la dichiarazione è il tuo processore XML (poniamo problemi come Questo a parte). Se si desidera soddisfare pienamente le specifiche, si dovrebbe passare ogni .xml file attraverso dos2unix in primissimo posto.

Ma poiché il vero problema è con il contenuto della variabile, questo potrebbe essere sufficiente nel tuo caso:

var=`find … | dos2unix | xargs`

Se non lo hai dos2unix, tr -d '\r' funzionerebbe come sostituto in questo contesto (grazie a @GordonDavisson per averlo indicato).


1
Se non lo hai dos2unix, tr -d '\r' funzionerebbe come un sostituto in questo contesto.
Gordon Davisson

@GordonDavisson Grazie, questo è utile.
Kamil Maciorowski
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.