4

За эти годы я несколько раз гуглил это и не нашел хорошего решения, поэтому я сдаюсь и спрашиваю.

Я хочу иметь возможность удалить все слова и знаки препинания, которые не соответствуют шаблону.

Так скажи, у меня есть этот список

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1

Я хочу удалить все, НО bwrb. * 471, [0-9], поэтому я остался с

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1

Есть ли простая команда VIM, которая может выполнить?

Благодарю.

3 ответа3

11
:%s/\v(.*)(bwrb.*471,\d)(.*)/\2

делает то, что вы хотите с вашим образцом. Вероятно, его нужно будет изменить, если ваши потребности в реальном мире будут более сложными.

По сути, шаблон соответствует всей строке, но мы используем группирование, чтобы отделить то, что мы хотим, от того, что мы не делаем. Мы получаем три группы: «до того, что мы хотим», "что мы хотим", «после того, что мы хотим», и мы заменяем всю строку второй группой, отмеченной \1 .

Шаг за шагом:

  • %s/

    Замена производится по всему файлу.

  • \v

    Флаг "очень волшебный" полезен для ограничения количества обратных слешей и улучшения разборчивости.

  • (.*)

    Первая группа содержит любое число любого символа. Привязка к началу строки подразумевается так, что она соответствует тому, что есть до того, что вы хотите. Это было бы \(.*\) Без "очень волшебного" флага.

  • (bwrb.*471,\d)

    Это вторая группа: ваш шаблон. Единственное, что я изменил, это [0-9] который я заменил на эквивалентный, но более короткий \d .

  • (.*)

    Третья группа содержит любое число любого символа до конца строки.

  • /\2

    Запасная часть состоит только во второй группе.

2

Я бы использовал эту команду:

%s/.*\(BWRB.*471,[0-9]\).*/\1

%: применить команду ко всем строкам файла.

s/pattern/replacement/: замена команды как использовать с sed:

  • .* соответствует любому символу, пока не будет найдено совпадение подстроки \(BWRB.*471,[0-9]\) . Любые символы после подстроки соответствуют .* Скобки проинструктировать vi сохранить подстроку.

  • Замена \1 печатает ранее сохраненную подстроку, которая фактически удаляет все нежелательные символы из строки.

Например, этот файл (который является вашим примером слегка измененным):

R61,1,BWRBW0471,2
R14,1,BWRBW0471,5
R162,1,BWRBN0471,0
R61 ,1,BWRBN0471,4
R61 ,1,BWRBN0471,1
R61 ,1,BWRBN0766471,1

преобразуется в:

BWRBW0471,2
BWRBW0471,5
BWRBN0471,0
BWRBN0471,4
BWRBN0471,1
BWRBN0766471,1
1

Я не совсем уверен, насколько изменчивость предшествует вашим строкам, но звучит так, будто вы просто хотите "заменить до BWRB на каждой строке".

:% S /.*\zeBWRB // г

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .