我有一个文件,每行有一个插入,如下所示:
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);
答案 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}})。
$