Удаляет все пробелы после определенного слова

Элементы колляции обычно упоминаются в контексте сортировки.

Во многих языках колляция (сортировка, как в словаре) производится не только по символам. Например, в чешском языке 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.

5
24.01.2017, 03:29
4 ответа

Вы можете использовать \ 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
3
27.01.2020, 20:33

Использование 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] .

8
27.01.2020, 20:33

В Notepad++ отойдите окно поиска и замены

В поле поиска введите (VALUES)s* (это соответствует «ЗНАЧЕНИЯМ», за которым следует любое количество пробелов) В поле замены введите 1 (при этом вставляем первую группу (в скобках ())

Убедитесь, что регулярные выражения включены

Щелкните заменить все, чтобы заменить все экземпляры "ЗНАЧЕНИЯ[некоторые пробелы]" на "ЗНАЧЕНИЯ"

0
27.01.2020, 20:33

Использование sed :

sed -e 's/VALUES \+/VALUES/'

Использование + для сопоставления всех пробелов после VALUES

2
27.01.2020, 20:33

Теги

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