Я пытаюсь преобразовать правую одинарную кавычку в апостроф с помощью 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?
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
Ответы:
Вы можете попробовать другой инструмент, например
sed
:Или, поскольку мы делаем простой перевод, используйте
y
команду дляsed
:GNU
tr
не работает предположительно потому что:И
’
является многобайтовым символом:источник
sed
намного лучше для такой работы.tr
заменяется каждый из трех байтов отдельно на'
, следовательно,'''
также на прерывистые последовательности, где он заменил два из трех байтов аналогичными символами“
и”
. Вместо этого следует понимать, что три байта означают один символ, и заменить его вместо этого.’
это многобайтовый символ, также мы можем использоватьtr -c '[:print:][:cntrl:]' '-'
команду для замены любого непечатаемого символа , кроме допустимых управляющих символов, на-
. И вы увидите один’
перевод до 3 байтов символов, как---
. хорошая точка для многобайтового символа.Если вы также хотите преобразовать двойные кавычки и, возможно, другие символы, вы можете использовать GNU
iconv
://TRANSLIT
Суффикс говорит ,iconv
что для символов вне репертуара целевой кодировки (ASCII) здесь, он может заменить похожие символы или последовательность автоматически. Без суффиксаiconv
сдастся, как только найдет непереводимый символ.Обратите внимание, что
//TRANSLIT
это расширение GNU: POSIXiconv
его не поддерживает.источник
Вы можете использовать одно из этих
awk
решений:Или
источник
Используйте
-s
опциюtr
:От
man tr
:источник