tr: преобразовать апостроф в ASCII

tr: преобразовать апостроф в ASCII

Я пытаюсь преобразоватьПравая одинарная кавычкадляАпострофс использованием tr.

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

задан файл в кодировке UTF-8 с именем , aсодержащий следующий пример:

We’re not a different species
“All alone?” Jeth mentioned.

OS X использует BSD trи выдает хороший результат:

We're not a different species
“All alone?” Jeth mentioned.

Ubuntu использует GNU trи выдает такой неприятный результат:

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

Как выполнить это преобразование в Ubuntu?

решение1

Вы можете попробовать другой инструмент, например sed:

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

Или, поскольку мы делаем простой перевод, используйте yкоманду sed:

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

ГНУtrне работает, предположительно, потому что:

В настоящее время trполностью поддерживает только однобайтовые символы. В конечном итоге он будет поддерживать многобайтовые символы; когда это произойдет, опция -C заставит его дополнять набор символов, тогда как -c заставит его дополнять набор значений. Это различие будет иметь значение только тогда, когда некоторые значения не являются символами, и это возможно только в локалях, использующих многобайтовые кодировки, когда входные данные содержат ошибки кодирования.

И является многобайтовым символом:

$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c  
3

решение2

Если вы также хотите преобразовать двойные кавычки и, возможно, другие символы, вы можете использоватьГНУiconv:

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

Суффикс //TRANSLITсообщает iconv, что для символов, не входящих в репертуар целевой кодировки (здесь ASCII), он может автоматически заменять похожие символы или последовательности. Без суффикса он iconvсдастся, как только найдет непереводимый символ.

Обратите внимание, что //TRANSLITэто, похоже, расширение GNU:POSIXiconvне поддерживает.

решение3

Вы можете воспользоваться одним из этих awkрешений:

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

Или

awk '{gsub(/’/, "'"'"'");print}' file

решение4

Используйте -sопцию tr :

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

От man tr :

--truncate-set1
          first truncate SET1 to length of SET2

Связанный контент