Sed / Awk:删除最后一次出现模式后的所有行

时间:2018-05-08 14:34:34

标签: bash awk sed

我有一个文件,每行有一个插入,如下所示:

INSERT INTO table (columns) values (1,x,b);
INSERT INTO table (columns) values (2,y,c);
INSERT INTO table (columns) values (3,w,d);
INSERT INTO table (columns) values (4,z,e);
-- Comment
SELECT * FROM table;
-- Comment
SELECT * FROM table;

如何在INSERT INTO最后一次发生后删除每一行?我正在寻找的输出是:

INSERT INTO table (columns) values (1,x,b);
INSERT INTO table (columns) values (2,y,c);
INSERT INTO table (columns) values (3,w,d);
INSERT INTO table (columns) values (4,z,e);

4 个答案:

答案 0 :(得分:2)

更简单的方法是使用tac

tac file|sed '0,/^INSERT INTO/{/INSERT INTO/!d}'|tac

您也可以在没有tac的情况下使用awk:

awk 'NR==FNR{if(/^INSERT INTO/)e=NR;next}FNR<=e' file file

答案 1 :(得分:0)

关注awk也可以帮助您。

awk 'FNR==NR{if($0 ~ /^INSERT/){count++};next} /INSERT/{val++} 1; val==count{exit} '   Input_file  Input_file

答案 2 :(得分:0)

使用gnu sed

如果在最后一次'INSERT INTO'之前没有评论

sed -n '/INSERT INTO/{p;b};q' infile

如果在最后一次'INSERT INTO'之前有一些评论

sed -z 's/\(.*INSERT INTO[^\n]*\n\).*/\1/' infile

答案 3 :(得分:0)

如果你有一个实际的文件而不是一个流,你可以使用ed一行代码:

?^INSERT INTO?+,$d

这会删除(d)从(+)最后一个匹配(?...?)模式^INSERT INTO到最后一行({{ 1}})。

演示:

$