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

Bash Sed/Awk:在最后一次出现模式后删除所有行,bash,awk,sed,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 * F

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

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 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);

更简单的方法是使用
tac

tac file|sed '0,/^INSERT INTO/{/INSERT INTO/!d}'|tac
awk 'NR==FNR{if(/^INSERT INTO/)e=NR;next}FNR<=e' file file
您也可以在不使用
tac
的情况下使用awk:

tac file|sed '0,/^INSERT INTO/{/INSERT INTO/!d}'|tac
awk 'NR==FNR{if(/^INSERT INTO/)e=NR;next}FNR<=e' file file
awk'NR==FNR{if(/^INSERT-INTO/)e=NR;next}FNR使用gnu sed

如果在最后一次“插入”之前没有注释

sed -n '/INSERT INTO/{p;b};q' infile
sed -z 's/\(.*INSERT INTO[^\n]*\n\).*/\1/' infile
如果在最后一次“插入”之前有一些注释

sed -n '/INSERT INTO/{p;b};q' infile
sed -z 's/\(.*INSERT INTO[^\n]*\n\).*/\1/' infile
如果您有实际的文件而不是流,则可以使用
ed
一行程序:

?^INSERT INTO?+,$d
这将删除(
d
)与模式匹配的最后一行(
?…?
)后面(
^插入到
)直到最后一行(
$
)的所有内容

演示:
#/垃圾箱/垃圾箱
文件名=$(mktemp)

cat>>“$filename”对于给定的示例,您只需
grep“插入”文件
。。。如果这没有帮助,请更改示例以更好地表示您的用例。。此外,你还需要展示你所做的尝试。。否则,当我听到“在最后一次之后做某事…”时,我会想到“反转文件,在第一次之前做某事…”,这就是一个免费的编码请求。仔细看看肯特的答案。