Файловым системам при форматировании присваивается случайный номер для их уникальной идентификации. Раньше вам приходилось настраивать загрузчик и / etc / fstab, чтобы определить, какие файловые системы должны быть смонтированы, где используется узел dev, который состоит из произвольно назначенного идентификатора, такого как / dev / sda, и номера раздела. Проблема заключалась в том, что при изменении номеров разделов все существующие ссылки ломались. По-настоящему большая проблема возникла, когда произвольные идентификаторы самих дисков начали довольно часто меняться. С дисками IDE их могло быть только 4, и поэтому в зависимости от того, к какому физическому порту был подключен диск, это будет определять, был ли это / dev / hda или / dev / hdb. Однако для дисков SCSI, дисков SATA или систем с несколькими контроллерами дисков идентификатор просто назначается в том порядке, в котором они обнаруживаются, и этот порядок является несколько случайным и может меняться от одной загрузки к другой, даже если вы не Не делайте ничего вроде (отключайте) USB-диск. По мере того, как такие системы стали популярными, стало важно не полагаться на имена узлов разработки, и поэтому системы переключились на использование UUID для определения того, какая файловая система должна быть смонтирована, и какой узел разработки, который он может показывать при данной загрузке, не неважно.
Элементы колляции обычно упоминаются в контексте сортировки.
Во многих языках колляция (сортировка, как в словаре) производится не только по символам. Например, в чешском языке ch
не сортируется между cg
и ci
, как в английском, а рассматривается как единое целое для сортировки. Это элемент коллажа (мы не можем ссылаться здесь на символ, символ - это подмножество элементов коллажа), который сортирует между h
и i
.
Теперь вы можете спросить: Какое отношение это имеет к регулярным выражениям?, Зачем мне ссылаться на элемент коллатерали в скобочном выражении?.
Ну, внутри скобочных выражений действительно используется порядок. Например, в [c-j]
вы хотите, чтобы символы находились между c
и j
. А вы? Вам скорее нужны элементы коллажа. [h-i]
в чешской локали соответствует ch
:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Итак, если вы можете перечислить диапазон элементов сопоставления в скобочном выражении, то вы ожидаете, что сможете перечислить их и по отдельности. [a-cch]
будет соответствовать элементам свертки между a
и c
и символам c
и h
. Чтобы иметь a-c
и элемент ch
, нам нужен новый синтаксис:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
(те, что между a
и c
и ch
).
Итак, мир еще не совершенен и, вероятно, никогда не станет совершенным. Приведенный выше пример был на системе GNU и работал. Другим примером элемента collating element может быть e
с сочетающимся острым ударением в UTF-8 ($'e\u0301'
рендерится как $'\u00e9'
как é
).
é и é - это один и тот же символ, за исключением того, что один представлен одним символом, а другой - двумя.
$ echo $'e\u301t\ue9' | grep '^[d-f]t'
Будет правильно работать в некоторых системах, но не в других (например, не в GNU). И непонятно, должен ли $'[[.\ue9.]]''
соответствовать только $'\ue9'
или и $'\ue9'
и $'e\u301'
.
Не говоря уже о неалфавитных скриптах, или скриптах с различными региональными порядками сортировки, таких как ffi (ffi
в одном символе), которые становится сложно обрабатывать с помощью такого простого API.
Это полезно, когда используются неанглийские (неascii) символы. Пример ch
, который вы упомянули, является диграфом, т.е. некоторые языки имеют в своем алфавите букву, которая представлена/может быть представлена двумя буквами английского алфавита.
Когда вы используете [.ch.]
в регексп, вы, по сути, говорите: "Я ожидаю неанглийскую входную последовательность с диграфом ch
. Я хочу, чтобы мой регексп соответствовал единственному символу ch
". Мой язык программирования/движок регекса/клавиатура не позволяют мне написать знак этого диграфа, поэтому я набираю [.ch.]
. Я не имею в виду c
, за которым следует h
. Пожалуйста, найдите только те случаи, когда диграф встречается в виде одного символа"
[[.ch.]]
означает, что диграф является частью набора символов. В данном случае фактически только один символ. Просто стандартная нотация regexp.