Я пытаюсь преобразовать Правильную Единственную Кавычку в использование Апострофа 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?
Вы могли попробовать некоторый другой инструмент, как 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
Если Вы также хотите преобразовать двойные кавычки, и возможно другие символы, Вы могли бы использовать 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
не поддерживает его.
Можно использовать один из этих 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
Используйте -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