Для меня tr отлично работает как для файлов ascii, так и для файлов utf-8, если ваша ОС настроена на работу с кодовой страницей utf-8.
Вот мой пример №1 (Solaris 11):
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
Как видите, ОС настроена на работу с utf-8. Я создал оба файла в кодовой странице utf-8:
$ cat file
Bob’s Bob′s Bob's
$ cat apos
’′'
Затем я получил ожидаемые результаты, заменив все apos следующим образом:
$ cat file | tr "$(cat apos)" "xxx"
Bobxs Bobxs Bobxs
Вот мой пример №2 (Solaris 10):
$ locale
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
Здесь вы можете видеть, что эта ОС настроена для обработки простого ASCII, а не utf-8, поэтому вы можете ожидать проблем с обработкой файлов utf-8 с многобайтовыми символами с использованием tr. Но есть обходной путь.Поскольку команда long tr позволяет вводить восьмеричное представление символа, вы можете заменить все байты указанного символа восьмеричным представлением.
В вашем случае:
char hex octal
’ E2 80 99 \342\200\231
′ E2 80 B2 \342\200\262
' 27 \47
Первый и второй апос представлены тремя байтами. Третий - стандартный ascii (один байт).
Итак, если вы хотите заменить первый апос, вы можете использовать:
$ cat file | tr "\342\200\231" "\0\0x"
Bobxs Bob▒s Bob's
Второй:
$ cat file | tr "\342\200\262" "\0\0x"
Bob▒s Bobxs Bob's
Третий:
$ cat file | tr "\47" "x"
Bob’s Bob′s Bobxs
Чтобы заменить все одним выстрелом, вы можете использовать:
$ cat file | tr "\342\200\231\262\47" "\0\0xxx"
Bobxs Bobxs Bobxs
Конечно, это не идеально, пока это заменит все вхождения байта \342, \200, \231, \262 в файле, поэтому другие многобайтовые символы, содержащие эти байты, будут повреждены. Но если ваш файл не содержит других многобайтовых символов, он будет работать.
Я могу правильно читать почту пользователей, указав путь к файлу:
mail -f /var/spool/mail/$USER
Я также столкнулся с некоторыми проблемами при чтении электронной почты пользователя (root), Я вошел в систему с помощью ssh с пользователем phil, затем я сменил пользователя на root, набрав sudo su
, а затем выполнив команду mail
, которую я получил:
Нет почты для phil
Так что, похоже эта почтовая команда попытается прочитать электронную почту пользователя, с которым вы открыли ssh-соединение. И как выяснилось, причина в неправильном значении переменной $ MAIL
:
[root@preprod ~]# echo $MAIL
/var/spool/mail/phil
попробуйте использовать sudo su -
'-' позволит установить профиль и переменную среды для пользователя, которым вы являетесь переключение на которое затем позволит почтовой команде работать должным образом.
Примечание: это будет для всех переменных среды, а не только для $ MAIL.