![tr: преобразовать апостроф в ASCII](https://rvso.com/image/977082/tr%3A%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B0%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D1%84%20%D0%B2%20ASCII.png)
Я пытаюсь преобразоватьПравая одинарная кавычкадляАпострофс использованием 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