输入是input.txt
包含这些行的文件
5
ccc
36
52
1
2
3
78
69
aaa
bb
固定的行顺序是这样的
1
2
3
我想删除这个序列以及之后的所有内容,只得到这个
5
ccc
36
52
我必须将此输出插入到output.txt
.我想我可以同时使用 sed 和 grep,但我做不到。
答案1
一种方法(使用sed
)是使用 3 行“滑动窗口”:
一次打印一行,并在该特定的 3 行序列位于模式空间中时退出:
sed -n '1N;$!N;/1\n2\n3/q;P;D' input > output
答案2
使用pcregrep
:
$ pcregrep -v -M "^1$\n^2$\n^3$\n(.*\n)*" file
-v , --反转匹配
反转匹配的意义,以选择不匹配的行。 (-v 由 POSIX 指定。)
-M, --多行
允许模式匹配多行。当给出此选项时,模式可能会有效地包含文字换行符以及内部出现的 ^ 和 $ 字符。
$ pcregrep -M "^1$\n^2$\n^3$\n(.*\n)*" file
1
2
3
78
69
aaa
bb
上面的命令获取多行模式以及之后的每条记录。通过-v
选项,该命令会给出所需的输出。