GNU sed
работает с многобайтовыми символами. Итак:
$ echo é½Æ | sed 'y/é½Æ/ABŒ/'
ABŒ
Дело не столько в том, что GNU tr
не был интернационализирован, сколько в том, что он не поддерживает многобайтовые символы (например, не-ASCII в локалях UTF-8). GNU tr
будет работать с Æ
, Œ
, если они будут однобайтовыми, как в наборе символов iso8859-15.
Подробнее об этом на Как сделать так, чтобы tr знал о символах, отличных от ascii (unicode)?
В любом случае, это не имеет ничего общего с Linux, это касается реализации tr
в системе. Использует ли эта система Linux в качестве ядра, или tr
построена для Linux, или использует API ядра Linux, не имеет значения, поскольку эта часть функциональности tr
выполняется в пользовательском пространстве.
busybox tr
и GNU tr
чаще всего встречаются в дистрибутивах программного обеспечения, созданного для Linux, и не поддерживают многобайтовые символы, но есть и другие, которые были портированы. для Linux, как tr
набора инструментов семейной реликвии (перенесенного из OpenSolaris) или ast-open, которые делают.
Обратите внимание, что sed
's y
не поддерживает диапазоны вроде a-z
. Также обратите внимание, что если этот сценарий, содержащий sed 'y/é½Æ/ABŒ/'
, написан в кодировке UTF-8, он больше не будет работать должным образом, если вызывается в локали, где UTF-8 не используется. кодировка.
В качестве альтернативы можно использовать perl
:
perl -Mopen=locale -Mutf8 -pe 'y/a-zé½Æ/A-ZABŒ/'
Выше код perl должен быть в UTF-8, но он будет обрабатывать ввод в кодировке локали (и выводить в той же кодировке). кодировка). При вызове в локали UTF-8 он транслитерирует UTF-8 Æ
(0xc3 0x86) в UTF-8 Œ
(0xc5 0x92) и в ISO8859-15 то же самое. но для 0xc6 -> 0xbc.
В большинстве оболочек наличие этих символов UTF-8 в одинарных кавычках должно быть приемлемым, даже если скрипт вызывается в локали, где UTF-8 не является кодировкой (исключением является yash
, который пожаловаться, если эти байты не образуют допустимых символов в локали). Однако если вы используете не одинарные кавычки, а другие кавычки, это может вызвать проблемы. Например,
perl -Mopen=locale -Mutf8 -pe "y/♣\`/&'/"
не будет работать в локали, где используется кодировка BIG5-HKSCS, потому что кодировка \
(0x5c) также содержится в некоторых других символах (например, α
: 0xa3 0x5c, а кодировка UTF-8 ♣
заканчивается на 0xa3).
В любом случае, не ожидайте, что такие вещи, как
perl -Mopen=locale -Mutf8 -pe 'y/Á-Ź/A-Z/'
, помогут убрать острые акценты. Вышеупомянутое на самом деле просто
perl -Mopen=locale -Mutf8 -pe 'y/\x{c1}-\x{179}/\x{41}-\x{5a}/'
То есть диапазон основан на кодовых точках Unicode.Таким образом, диапазоны не будут полезны за пределами очень четко определенных последовательностей, которые находятся в порядке " right" в Unicode, например A-Z
, 0-9
.
Если вы хотите удалить острые ударения, вам придется использовать более продвинутые инструменты, такие как:
perl -Mopen=locale -MUnicode::Normalize -pe '
$_ = NFKD($_); s/\x{301}//g; $_ = NFKC($_)'
То есть использовать формы нормализации Unicode для разложения символов, удалить острые ударения (здесь форма объединения U+0301
) и перекомпоновать.
Еще одним полезным инструментом для транслитерации Unicode является uconv
от ICU. Например, приведенное выше можно записать так:
uconv -x '::NFKD; \u0301>; ::NFKC;'
Хотя будет работать только с данными UTF-8. Вам потребуется:
iconv -t utf-8 | uconv -x '::NFKD; \u0301>; ::NFKC;' | iconv -f utf-8
Чтобы иметь возможность обрабатывать данные в локали пользователя.
Предложение по использованию справочной страницы предполагает, что --activate
допустимо только с--cache
pvscan --cache
[ -b|--background ]
[ -a|--activate ay ]
[ -j|--major Number ]
[ --minor Number ]
[ COMMON_OPTIONS ]
[ String|PV... ]