2014-11-21 16 views
5

Ho il seguente comando per sostituire i caratteri Unicode con quelli ASCII.Come sostituire i caratteri Unicode con ASCII

sed -i 's/Ã/A/g' 

Il problema è Ã non viene riconosciuto dal comando sed nel mio ambiente Unix così mi piacerebbe pensare di sostituirlo con il suo valore esadecimale. Come sarebbe la sintassi se dovessi utilizzare C3?

sto usando questo comando come un modello per gli altri personaggi che mi piacerebbe sostituire con spazi vuoti come:

sed -i 's/©// g'

+0

intendi in questo modo? http://stackoverflow.com/questions/22450563/sed-matching-unicode-blocks-with – Leo

+1

Quale set di caratteri utilizza il terminale? E quale codifica usa il testo di input? Ã in UTF-8 è 0xC3 0x83 e il carattere 0x83 è un codice di controllo in ISO 8859-1, quindi potrebbe essere un problema. Suppongo che tu non possa semplicemente impostare 'LANG = en_US.UTF-8' sul tuo sistema. – yellowantphil

+0

"sed" farà il lavoro. Per favore vedi la mia risposta. – ajaaskel

risposta

2

È possibile utilizzare iconv:

iconv -f utf-8 -t ascii//translit 
+3

Intendi GNU iconv. Non tutte le versioni di iconv supportano la traslitterazione. –

+1

Sì, ma può provarlo – tinySandy

+0

Grazie, ma sto usando questo come modello per creare altri comandi sed che sostituiranno determinati caratteri con spazi vuoti, ad esempio: sed -i//// g ' –

9

È possibile utilizzare valori esadecimali in "sed".

echo "Ã" | hexdump -C 
00000000 c3 83 0a           |...| 
00000003 

Ok, quel carattere è una combinazione di due byte "c3 83". Diciamo sostituirla con singolo byte "A":

echo "Ã" |sed 's/\xc3\x83/A/g' 
A 

Spiegazione: \ x indica per "sed" che un codice esadecimale segue.

+0

Di solito scriverei quelli con <<< ma i piping danno un'idea migliore per un lettore medio che cosa sta succedendo. – ajaaskel

+0

Cosa intendi con "scrivili con <<<"? – isomorphismes

+1

hexdump -C <<< Ö – ajaaskel

3

impostazione LANG=C e quindi eseguirlo su tutta la gamma Unicode Prova:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"

3

C'è anche uconv, da ICU.

Esempi:

  • uconv -x "::NFD; [:Nonspacing Mark:] > ; ::NFC;": per rimuovere gli accenti
  • uconv -x "::Latin; ::Latin-ASCII;": per una traslitterazione latina/ascii
  • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;": per una traslitterazione latina/ASCII e la rimozione di punti di codice rimanenti> 0x7F
  • ...

echo "À l'école ☠" | uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;" restituisce: A l'ecole

Problemi correlati