![需要从文件中删除以下行中包含的所有行](https://linux22.com/image/1570783/%E9%9C%80%E8%A6%81%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E4%BB%A5%E4%B8%8B%E8%A1%8C%E4%B8%AD%E5%8C%85%E5%90%AB%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
我有一些如下所示的文件:
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 块来打印文件的最后一行