tr аналог для символов юникода?

Для шлюза для каждой подсети у вас может быть шлюз, который является IP-адресом сетевой карты, через которую вы хотите пройти, например 192.168.1.0/ 24 у вас может быть шлюз для этой подсети, который является вашим IP-адресом на этом сетевом адаптере.

Для шлюза по умолчанию: Нет, как правило, у вас не может быть двух разных шлюзов по умолчанию на одном компьютере, потому что это будет неоднозначно для системы, чтобы определить, на каком интерфейсе она будет отправлять пакет, который не соответствует ни одной строке. в таблице маршрутов, кроме той, которая соответствует всем.

Для сервера имен: да, вы можете определить два сервера имен для каждого интерфейса, и вы можете разместить больше серверов имен для всей системы.

7
01.09.2017, 01:34
2 ответа

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

Чтобы иметь возможность обрабатывать данные в локали пользователя.

12
27.01.2020, 20:17

В Bash можно использовать расширение параметра .

Замена Åвыполнена успешно:

$ string='Hello Ångstrom'
$ a='Å'
$ b='Œ'
$ printf '%s\n' "${string//${a}/${b}}"
Hello Œngstrom

Попытка замены Æ, которая не является частью строки:

$ string='Hello Ångstrom'
$ a='Æ'
$ b='Œ'
$ printf '%s\n' "${string//${a}/${b}}"
Hello Ångstrom
2
27.01.2020, 20:17

Теги

Похожие вопросы