Элементы колляции обычно упоминаются в контексте сортировки.
Во многих языках колляция (сортировка, как в словаре) производится не только по символам. Например, в чешском языке 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.
Вы можете использовать \ s *
(GNU) или [[: space:]] *
(переносимый) для захвата табуляции (и всех других символов горизонтального и вертикального интервала) как а также пробелы.
$ cat file
stuff and VALUES <--tab
more VALUES <--three spaces
VALUES <--tab, three spaces, tab
$ sed 's/VALUES\s*/VALUES/' file
stuff and VALUES<--tab
more VALUES<--three spaces
VALUES<--tab, three spaces, tab
Использование sed
:
$ sed 's/VALUES[[:blank:]]*/VALUES/g' input >output
Это заменит ЗНАЧЕНИЯ
, за которыми следует любое количество пробельных символов (пробел или табуляция), на VALUES
, т.е. он удалит пробелы.
Если важно, чтобы VALUES
соответствовали как полное слово, т. Е. Что somethingVALUES
не соответствует , тогда вставьте слово (в начале) образец границы перед ЗНАЧЕНИЯ
:
$ sed 's/[[:<:]]VALUES[[:blank:]]*/VALUES/g' input >output
Я оставлю это до конца этого ответа.
Для более сложного значения VALUES
может быть удобно не вводить его дважды:
$ sed 's/\(VALUES\)[[:blank:]]*/\1/g' input >output
Это сохраняет шаблон VALUES
и повторно использует его при замене.
Если шаблон VALUES
хранится в переменной оболочки $ values
:
$ sed "s/\($values\)[[:blank:]]*/\1/g" input >output
Это более или менее переносится непосредственно в редактор Vim:
:%s/\(VALUES\)[[:blank:]]*/\1/
Как я никогда использовал Notepad ++, могу только догадываться, как им пользоваться. Очевидно, нужно иметь возможность нажать Ctrl + H и ввести шаблон поиска / поиска и замены.
Шаблон поиска может быть (ЗНАЧЕНИЯ) [[: blank:]] *
, а шаблон замены может быть 1
. У меня нет возможности проверить это, извините. Если [[: blank:]]
не работает, попробуйте использовать [\ t]
.
В Notepad++ отойдите окно поиска и замены
В поле поиска введите (VALUES)s*
(это соответствует «ЗНАЧЕНИЯМ», за которым следует любое количество пробелов)
В поле замены введите 1
(при этом вставляем первую группу (в скобках ()
)
Убедитесь, что регулярные выражения включены
Щелкните заменить все, чтобы заменить все экземпляры "ЗНАЧЕНИЯ[некоторые пробелы]" на "ЗНАЧЕНИЯ"
Использование sed
:
sed -e 's/VALUES \+/VALUES/'
Использование +
для сопоставления всех пробелов после VALUES