2013-11-08 2 views
0

У меня есть файл, как показано ниже. Я хотел бы удалить все строки перед foo, но оставить только один последний экземпляр панели. Вход:Удаление строк с помощью sed

bar1 
foo 
bar1 
bar2 
bar3 
foo 
bar5 
bar6 
bar7 
foo 

Выход:

bar1 
foo 
bar3 
foo 
bar7 
foo 

Может кто-то пожалуйста, помогите мне, как это сделать. Я пытаюсь использовать sed, но все мои попытки ничего не дали.

+1

Как у вас есть «bar6» в желаемом выходе; разве это не 'bar7'? – devnull

ответ

6

Надеюсь, это не обязательно sed. Использование grep «s -B вариант для печати соответствия строки и 1 строка перед ним:

grep -B 1 foo input > output 
+0

'-A', если следующая строка :) Хороший ответ – Ashish

+1

Я считаю, что OP хочет' bar6' перед последним 'foo'. – anubhava

+2

@anubhava Я готов поспорить, что это была опечатка в примере. – Barmar

1

Использование awk вы можете сделать:

awk '/^foo/ {print a "\n" $0} /^bar/ {a=$0}' file 
bar1 
foo 
bar3 
foo 
bar7 
foo 
0

Это может работать для вас (GNU СЭД):

sed '$!N;/^bar.*\nfoo/!D' file 
Смежные вопросы