1

У меня есть несколько файлов, которые выглядят так:

0
04
040
040t
040te
040tes
040test
040test2
041
041t
041te
041tes
041test
041test1
0n
0ne
0ne-
0ne-o
0ne-os
0ne-osx

Мне нужно удалить все строки, которые включены в строку после них. IOW, мне нужно уменьшить это до этого:

040test2
041test1
0ne-osx

Любые предложения для Linux CLI или vim для достижения этой цели? Благодарю.

2 ответа2

2

В Vim вы можете попробовать эту глобальную команду:

g/^\(.*\)\n\1.\+/d
│ ├────────────┘ │
│ │              └ delete the matching lines (see `:h :d`)
│ │
│ └ pattern matching 2 lines, the second one starting like the 1st
│
└ global command (see `:h :g`)
1

Perl на помощь!

perl -lne 'print $prev if -1 == index $_, $prev;
           $prev = $_;
           END { print $prev }' -- file.txt
  • -n читает строку ввода построчно
  • -l удаляет новые строки из ввода и добавляет их в print
  • $_ - это специальная переменная, которая содержит фактическую строку, прочитанную из ввода
  • index возвращает -1, если подстрока (2-й аргумент) не найдена в строке (1-й аргумент)
  • блок END необходим для печати последней строки файла

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