2014-11-21 2 views
5

У меня есть следующая команда для замены символов Unicode на ASCII.Как заменить символы Unicode на ASCII

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

Проблема заключается в том Ã не распознается SED команды в моей среде Unix, так что я предполагаю, что вы заменить его шестнадцатеричное. Как бы выглядел синтаксис, если бы я вместо этого использовал C3?

Я использую эту команду в качестве шаблона для других персонажей я хотел бы заменить пробелами, таких как:

СЕПГ -i «s/©// г»

+0

Вы имеете в виду вот это? http://stackoverflow.com/questions/22450563/sed-matching-unicode-blocks-with – Leo

+1

Какой набор символов используется вашим терминалом? И какая кодировка использует входной текст? Ã в UTF-8 - 0xC3 0x83, а символ 0x83 - это управляющий код в ISO 8859-1, так что это может быть проблемой. Полагаю, вы не можете просто установить в вашей системе 'LANG = en_US.UTF-8'. – yellowantphil

+0

«sed» выполнит эту работу. Пожалуйста, см. Мой ответ. – ajaaskel

ответ

2

Вы можете использовать iconv:

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

Вы имеете в виду GNU iconv. Не все версии iconv поддерживают транслитерацию. –

+1

Да, но он может дать ему попробовать – tinySandy

+0

Спасибо, но я использую это как шаблон для создания других команд sed, которые заменят некоторые символы пустым пространством, например: sed -i 's/©// g' –

9

В «sed» можно использовать шестнадцатеричные значения.

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

Хорошо, этот символ состоит из двух байт «c3 83». Давайте заменим его с одного байта «A»:

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

Объяснение: \ х указывает на «СЭД», что шестнадцатеричный код следующим образом.

+0

Обычно я пишу те с <<<, но трубопровод дает лучшую идею для среднего читателя, что происходит. – ajaaskel

+0

Что значит «писать их с <<<»? – isomorphismes

+1

hexdump -C <<< Ö – ajaaskel

3

Try установки LANG=C, а затем запустить его в диапазоне Unicode:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"

3

Существует также uconv от ICU.

Примеры:

  • uconv -x "::NFD; [:Nonspacing Mark:] > ; ::NFC;": для удаления акцентов
  • uconv -x "::Latin; ::Latin-ASCII;": для транслитерации латинской/ASCII
  • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;": для транслитерации латинского/ASCII и удаления оставшихся кодовых точек> 0x7F
  • ...

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