Как удалить текст после указанного символа в Vim - PullRequest
11 голосов
/ 18 сентября 2011

Мои данные имеют вид:

id|name|things that I don't care

Поэтому для каждой строки я хочу удалить текст после второго символа |.

Как мне сделать это в Vim содна команда?

Редактировать:

На самом деле после второй | есть дополнительные трубы, так как | используется в качестве разделителя для столбцов.

Ответы [ 5 ]

18 голосов
/ 18 сентября 2011

Одно решение:

:%s!^\([^|]*|\)\{2\}\zs.*!!

Пояснение:

  • %: в каждой строке
  • s: подстановка
  • !: начало паттерна
  • ^: начало строки
  • \(: начало группы
  • [^|]*: любое количество непотоковых символов
  • |: за ним следует труба
  • \): конец группы
  • \{2\}: сопоставить два счета этой группы
  • \zs: начать сопоставление с шаблоном здесь
  • .*: любые символы
  • !: конец шаблона и начало замены
  • !: конец замены

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

До

id name things that I don't care no pipes
id|name things that I don't care one pipe
id|name|things that I don't care two pipes
id|name|things that I don't care extra pipe at line end|
id|name|things that I don't care | extra pipe mid-line
id|name|things that I don't| care| two extra pipes
name|things that I don't care missing first column and pipe
|name|things that I don't care missing first column

* После 1071 *:

id name things that I don't care no pipes
id|name things that I don't care one pipe
id|name| 
id|name| 
id|name| 
id|name| 
name|things that I don't care missing first column and pipe
|name| 
11 голосов
/ 18 сентября 2011

Можно просто повторить команду нормального режима, которая переходит к символу рядом со вторым символом | и удаляет до конца строки для каждой из строк.

:%norm!2f|lD
1 голос
/ 18 сентября 2011

Если в части "пофиг" нет труб, то

:%s/|[^|]*$/|/

, которая также имеет дело с пустыми частями "пофиг".И он продолжает работать, если вы добавляете новые поля перед частью "все равно".

0 голосов
/ 18 сентября 2011

:%s/[^|]*|[^|]*|\zs.*//

Вариант того, что мы уже видели.

Дважды сопоставьте множество «не труба», а затем трубу.Заменить ничем, начиная со второй трубы (\ zs).

0 голосов
/ 18 сентября 2011

Я бы сделал что-то вроде:

%s/\(.*|.*|\).*/\1

Да, это сработало:

yeap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...