Sed / Awk: удалить все строки после последнего появления шаблона - PullRequest
0 голосов
/ 08 мая 2018

У меня есть файл с одной вставкой в ​​каждой строке, как показано ниже:

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 голосов
/ 09 мая 2018

Если у вас есть действительный файл , а не поток, вы можете использовать ed однострочник:

?^INSERT INTO?+,$d

Это удаляет (d) все из строки после (+) последнего, который соответствует (?...?) шаблону ^INSERT INTO до последней строки ($).

Демо-версия:

#!/bin/sh

filename=$(mktemp)

cat >>"$filename" <<'END'
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;
END


ed -s "$filename" <<'END'
?^INSERT INTO?+,$d
wq
END


cat "$filename"
rm "$filename"
0 голосов
/ 08 мая 2018

После awk может помочь вам тоже.

awk 'FNR==NR{if($0 ~ /^INSERT/){count++};next} /INSERT/{val++} 1; val==count{exit} '   Input_file  Input_file
0 голосов
/ 08 мая 2018

с гну сед

Если до последнего 'INSERT INTO' нет комментариев

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

Если есть комментарии перед последним 'INSERT INTO'

sed -z 's/\(.*INSERT INTO[^\n]*\n\).*/\1/' infile
0 голосов
/ 08 мая 2018

Более простой способ - использовать tac:

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

Вы также можете использовать awk без tac:

awk 'NR==FNR{if(/^INSERT INTO/)e=NR;next}FNR<=e' file file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...