Как в VIM удалить повторяющуюся строку в заданном диапазоне

5065584

Есть текстовый файл, в нем есть повторяющиеся строки. Нужно, чтобы, например, из диапазона с 5 по 50 строку каждая строка в результате встречалась только один раз. Гугление дало рецепт
:%s/^\(.*\)\n\1$/\1/ 

но оно удаляет только дважды встреченную строку и во всем файле. С заданием диапазона
:5,50s/^\(.*\)\n\1$/\1/  
рецепт не совмещается - то есть не работает.
Подскажите, пожалуйста правильный вариант

Serab

но оно удаляет только дважды встреченную строку
чем это отличается от того, что ты хочешь?
может так?

%s/^\(.*\)\(\n\1\)\+$/\1/

Serab

рецепт не совмещается - то есть не работает.

5065584

Ошибся. Не дают результата оба случая. Во втором случае ещё и выдается сообщение:
E486: Pattern not found: ^\(.*\)\n\1$  

Serab

1. какой результат

set magic?

2. Ты уверен, что у тебя там есть повторяющиеся строки? Нажми на какой-нибудь "yy p" (без кавычек) и попробуй заново.

5065584

1. Вывело сообщение
  magic  
в строке статуса
2. Повторяющиеся строки точно есть.

Serab

попробуй

5,50!uniq

rosali

%s/^\(.*\)\(\n\1\)*$/\1/

rosali

может так?
А ну да, с плюсом даже правильнее. Не знаю, у меня работает. Диапазон можно просто через V выделить, тоже работает.

Serab

да вот именно, что все работает, я даже не знаю, что там может быть не так :/

beluchy

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

5065584

Все, решение найдено.
1. Сортировать нужный участок
:2,127!sort
Теперь повторяющиеся строки идут сплошными блоками
2. Удалить повторяющиеся
2,127!uniq
Повторяющиеся строки удаляются

apl13

man -P cat sort | grep -A 1 -- -u

ramsit

-P cat - для понтов?
зы. Геныч, извращения всякие бывают, конечно, но vim все-таки для ручного редактирования :grin:

apl13

-P cat - для понтов?
Для надежности.
Для корректной работы команды и intended behaviour.

serega1604

man -P 'grep -A 1 -- -u' sort 
помни о котятах всегда.

apl13

Ты подстрелил меня, Билли! Ты всегда был чертовски ловок!

elenangel

из диапазона с 5 по 50 строку каждая строка в результате встречалась только один раз.
head source.txt -n 5 > result.txt
head source.txt -n 50|tail -n 45|uniq >> result.txt
tail source.txt -n +51 >> result.txt
Оставить комментарий
Имя или ник:
Комментарий: