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?

11
задан 27 November 2014 в 23:55

4 ответа

Вы могли попробовать некоторый другой инструмент, как 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.

GNU tr не работает, по-видимому, потому что:

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

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

$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c  
3
16
ответ дан 23 November 2019 в 03:53

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

9
ответ дан 23 November 2019 в 03:53

Можно использовать один из этих 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
ответ дан 23 November 2019 в 03:53

Используйте -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
ответ дан 23 November 2019 в 03:53

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

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