Использование sed для удаления всех строк после последнего указания указанной строки c в TXT - PullRequest
1 голос
/ 29 апреля 2020

У меня есть файл, который выглядит следующим образом:

Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2
Apple prices
$3.99 p 1
$4.65 p 2
$2.19 p 1

Мне нужна однострочная команда sed, которая удаляет все после того, как в последний раз упоминается «цены Apple». Таким образом, результат будет:

Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2

В sed я попытался использовать '/Apple prices/q2', но это удаляет все после первого упоминания, а не в последний раз.

Есть ли способ сделать так, чтобы он удалял все только после последнего упоминания с использованием sed?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Беда в том, что sed не знает, является ли появление «цен на Apple» последним, пока оно не достигнет другого - или конца файла. Но он может собирать строки в области удержания и откладывать решение:

sed -n '/Apple prices/{x;/./p;d;};H'

РЕДАКТИРОВАТЬ: Альтернатива, вдохновленная комментарием @ potong:

sed '/Apple prices/!{H;d;};x;1d;'
1 голос
/ 29 апреля 2020

Обычной тактикой c в таких случаях является обратный ввод строки за строкой, принятие решения на основе первого вхождения, а затем обратный вывод снова

$ # with awk: tac ip.txt | awk 'f; /Apple prices/{f=1}' | tac
$ tac ip.txt | sed '0,/Apple prices/d' | tac
Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...