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