/ / Как да създам команда VIM или Vi за изтриване на целия текст след определен знак за всеки ред в текстов файл? - regex, vim, vi, заменете

Как да създам команда VIM или Vi за изтриване на целия текст след определен знак за всеки ред в текстов файл? - regex, vim, vi, заменете

Сценарий:

  • Имам текстов файл, който има тръба (както в | характер) дефинирани данни.
  • Всяко поле от данни в полетата, обозначени с тръби, може да бъде с променлива дължина, така че броенето на символите няма да работи (или да се използва някаква функция на подсъзнанието ... ако това дори съществува във Vim).

Възможно ли е, използвайки Vim / Vi да изтриете всички данниот втората тръба до края на линията за цялото досие? Има около 150 000 линии, така че това да се прави ръчно ще привлече само мазохист ...

например

Променете следните редове от:

1111|random sized text 12345|more random data la la la|1111|abcde
2222|random sized text abcdefghijk|la la la la|2222|defgh
3333|random sized text|more random data|33333|ijklmnop

да се:

1111|random sized text 12345
2222|random sized text abcdefghijk
3333|random sized text

Сигурен съм, че това може да се направи по някакъв начин ... Надявам се.

TIA

UPDATE: Трябваше да спомена, че пускам това на Windows XP, така че нямам достъп до някои от споменатите * nix команди (CUT не е разпознат в Windows).

Отговори:

30 за отговор № 1
:%s/^v([^|]+|[^|]+)|.*$/1/

18 за отговор № 2

Можете също да запишете макрос:

qq02f | Djq

и след това ще можете да го пуснете с 100 @ q, за да стартирате макроса на следващите 100 реда.

Макро обяснение:

  • QQ - стартира макрозаписа
  • 0 - отидете до първия знак на линията
  • 2е | - намерете втората поява на | характер на линията
  • д - изтрийте текста след текущата позиция до края на реда
  • к - преминете към следващия ред
  • р - приключва макрозаписа

8 за отговор № 3

Ако не трябва да използвате vim, друга алтернатива ще бъде командата unix "cut".

cut -d "|" -f 1-2 file > out.file

4 за отговор № 4

Просто друг начин да направите едно и също нещо:

%s/^(.{-}|){2}zs.*//
%s/^(.{-}zs|){2}.*// " if you want to remove the 2nd pipe as well

Този път регексът съвпада с възможно най-малко символи ({-}), които са последвани от тръба и два пъти ({2}), те се игнорират (Zs), за да замени всички следващи (zс) текст от нищо.


3 за отговор № 5

Вместо замяната може да се използва :normal команда за повторение на последователност на две команди от нормален режим, които скачат до втория | характер и изтриване всичко останало до края на линията.

:%norm!2f|D

2 за отговор № 6

Използвайте: команда, за да направите потребителска команда, която лесно можете да изпълнявате.

:command -range=% YourNameHere <line1>,<line2>s/^v([^|]+|[^|]+)|.*$/1/

1 за отговор № 7

Можете също така да направите:

:%s/^([^|]+|[^|]+)|.*$/1/g

1 за отговор № 8

използвайте awk.

awk -F"|" "{$0=$1"|"$2}1" file

0 за отговор № 9

Намерих, че vim не е страхотно при работа с много големи файлове. Аз не съм сигурен колко голям е вашият файл. Може би котката и седят заедно ще работят по-добре.


0 за отговор № 10

Ето едно решение:

sed -e "s/^([^|]*|[^|]*).*$/1/"

0 за отговор № 11

Това ще филтрира всички линии в буфера (1, $) чрез изрязване за изпълнение на задачата.

:1,$!cut -d "|" -f 1-2

Опитайте с

:.!cut -d "|" -f 1-2

За да го направите само на текущия ред.


0 за отговор № 12

Защо да използвам vim?

Защо не просто го направя

cat my_pipe_file | cut -d"|" -f1-2