Как удалить текст после указанного символа в Vim

Мои данные имеют следующий вид:

id|name|things that I don't care

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

Как это сделать в Vim с помощью одной команды?

Edit:

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

Ответы

Ответ 1

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

:%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

После:

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| 

Ответ 2

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

:%norm!2f|lD

Ответ 3

Если часть "не заботится" не имеет труб, то

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

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

Ответ 4

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

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

Yeap, который работал:

yeap

Ответ 5

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

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

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