tr: конвертировать апостроф в ASCII

Я пытаюсь преобразовать знак правой одиночной котировки в Apostrophe, используя 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 и производит этот неприятный результат:

[ f4]

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

1
задан 28 November 2014 в 10:55

3 ответа

Если вы также хотите преобразовать двойные кавычки и, возможно, другие символы, вы можете использовать GNU 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: GNU iconv doesn Не поддерживайте его.

9
ответ дан 24 May 2018 в 01:32
  • 1
    +1. Если вы конвертируете текст из одного набора символов (или кодирования) в другой, может быть разумным использовать инструмент, предназначенный для этой цели. – RedGrittyBrick 28 November 2014 в 15:59
  • 2
    @deltab ваше решение также заменяет двойные кавычки, которые OP не хотят их заменять. – αғsнιη 28 November 2014 в 16:27
  • 3
    @KasiyA Может быть, они должны. – gerrit 28 November 2014 в 20:43

Вы можете использовать одно из этих 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
3
ответ дан 24 May 2018 в 01:32

Используйте опцию -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
0
ответ дан 24 May 2018 в 01:32
  • 1
    ваше решение также заменяет двойные кавычки, которые OP не хотят их заменять – αғsнιη 28 November 2014 в 16:25
  • 2
    Ах, действительно, спасибо за это. Я оставлю этот ответ для справки. – Skippy le Grand Gourou 28 November 2014 в 16:43

Другие вопросы по тегам:

Похожие вопросы: