我有一些如下所示的文件:
0
04
040
040t
040te
040tes
040test
040test2
041
041t
041te
041tes
041test
041test1
0n
0ne
0ne-
0ne-o
0ne-os
0ne-osx
我需要删除它们后面的行中包含的所有行。换句话说,我需要将其缩减为以下内容:
040test2
041test1
0ne-osx
有没有关于 Linux CLI 或 vim 实现此操作的建议?谢谢。
答案1
在 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`)
答案2
Perl 来救援!
perl -lne 'print $prev if -1 == index $_, $prev;
$prev = $_;
END { print $prev }' -- file.txt
-n
逐行读取输入-l
从输入中删除换行符并将其添加到print
$_
是包含从输入读取的实际行的特殊变量- 指数如果在字符串(第一个参数)中找不到子字符串(第二个参数),则返回 -1
- 需要 END 块来打印文件的最后一行