Domanda

La versione 4.1.5 di GNU sed sembra fallire con i caratteri internazionali.Ecco il mio file di input:

Gras Och Stenar Trade - da Moja a Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trade - Da Möja a Minneapolis DVD [G2007DVD] 7812 | Y

(Notare l'umlaut nella seconda riga.)

E quando lo farò

Sed 'S /.* | // '<in

Mi aspetterei di vedere solo X e Y, mentre ho chiesto di rimuovere tutti i caratteri fino al "|" e spazio oltre.Invece, ottengo:

X
Gras Och Stenar Trad - Da M?Y

So che posso usare tr per rimuovere i caratteri internazionali.prima, ma c'è un modo per usare solo sed?

È stato utile?

Soluzione

Penso che l'errore si verifichi se la codifica di input del file è diversa dalla codifica preferita del tuo ambiente.

Esempio: in è UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y

UTF-8 può essere tranquillamente interpretato come ISO-8859-1, otterrai caratteri strani ma a parte questo va tutto bene.

Esempio: in è ISO-8859-1

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Gras Och Stenar Trad - From MöY
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y

ISO-8859-1 non può essere interpretato come UTF-8, la decodifica del file di input non riesce.La strana corrispondenza è probabilmente dovuta al fatto che sed tenta di riprendersi piuttosto che fallire completamente.

La risposta è basata su Debian Lenny/Sid e sed 4.1.5.

Altri suggerimenti

sed non è configurato molto bene per il testo non ASCII.Tuttavia puoi utilizzare (quasi) lo stesso codice in perl e ottieni il risultato desiderato:

perl -pe 's/.*\| //' x
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top