2014-11-21 20 views
5

Mam następujące polecenie do zamiany znaków Unicode na znaki ASCII.Jak zamienić znaki Unicode na ASCII

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

Problemem jest à nie jest rozpoznawany przez polecenia sed w moim środowisku Unix więc ja zakładam, że zastąpić go jego wartości szesnastkowej. Jak wyglądałaby składnia, gdybym zamiast tego używał C3?

Używam tego polecenia jako wzorzec dla innych znaków chciałbym zamienić z pustych przestrzeniach, takich jak:

sed -i „s/©// g”

+0

masz na myśli? http://stackoverflow.com/questions/22450563/sed-matching-unicode-blocks-z – Leo

+1

Jakiego zestawu znaków używa twój terminal? A jakie kodowanie wykorzystuje tekst wejściowy? W UTF-8 jest 0xC3 0x83, a znak 0x83 jest kodem kontrolnym w ISO 8859-1, więc może to być problem. Przypuszczam, że nie możesz po prostu ustawić 'LANG = en_US.UTF-8' na swoim systemie. – yellowantphil

+0

"sed" wykona zadanie. Proszę zobaczyć moją odpowiedź. – ajaaskel

Odpowiedz

2

Można użyć iconv:

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

Masz na myśli GNU iconv. Nie wszystkie wersje translatora obsługują iconv. –

+1

Tak, ale może spróbować. – tinySandy

+0

Dzięki, ale używam tego jako szablonu do tworzenia innych poleceń sed, które zastąpią określone znaki pustymi miejscami, na przykład: sed -i 's/©// g' –

9

możliwe jest użycie wartości szesnastkowe w "sed".

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

Ok, ta postać jest kombinacją dwóch bajtów "c3 83". Załóżmy, zastąpić go jeden bajt "A":

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

Objaśnienie: \ x wskazuje na "sed", że kod szesnastkowy następująco.

+0

Zwykle pisałbym te z <<<, ale piping daje lepszy pomysł przeciętnemu czytelnikowi, co się dzieje. – ajaaskel

+0

Co masz na myśli "napisz do nich <<<"? – isomorphismes

+1

hexdump -C <<< Ö – ajaaskel

3

spróbuj ustawić LANG=C a następnie uruchomić go w całym zakresie Unicode:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"

3

Istnieje również uconv od ICU.

Przykłady:

  • uconv -x "::NFD; [:Nonspacing Mark:] > ; ::NFC;": usuwanie akcentami
  • uconv -x "::Latin; ::Latin-ASCII;" bo transliteracją łacińskiego/ASCII
  • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;": do transliteracją łacińska/ASCII oraz usunięcie pozostałych punktach kod> 0x7F
  • ...

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