2013-09-27 15 views
5
aaa aaaa aaaa aaaa 
sss ssss ssss ssss 
ddd dddd dddd dddd 
fff ffff ffff ffff 
abc pattern asd fde 
111 222 333 444 555 
666 777 888 999 000 

pożądany wynik: Jeśliusunąć wszystko przed tym wzór wzór używając awk i sed

111 222 333 444 555 
666 777 888 999 000 
+2

Staraj się nie myśleć i określić problemy, jeśli chodzi o to, co chcesz, aby usunąć z pliku, ale zamiast w kategoriach tego, co chcesz, aby wybrać z pliku - to często sprawia, różnica w czytelności, łatwości obsługi itp. rozwiązań, które Ty (i my) napotykamy na twój problem. –

Odpowiedz

10

Wystarczy ustawić flagę, gdy wzór został znaleziony. Od tego momentu, drukować wiersze:

$ awk 'p; /pattern/ {p=1}' file 
111 222 333 444 555 
666 777 888 999 000 

Albo też

awk '/pattern/ {p=1;next}p' file 

szuka pattern w każdej linii. Gdy zostanie znaleziony, zmienna p jest ustawiona na 1. Trudnym punktem jest to, że linie są drukowane po wydrukowaniu p>0, aby wydrukować następujące linie.

Jest to szczególny przypadek How to select lines between two patterns?, gdy nie ma takiego drugiego wzoru.

+1

'next' może zostać zapisany ...' awk 'p;/pattern/{p = 1}' ';) – Kent

+0

Muszę powiedzieć, że twoja oryginalna odpowiedź jest łatwiejsza do odczytania i zrozumienia. szczególnie, jeśli scenariusz był długi. – Kent

+0

awk 'p;/pattern/{p = 1} 'file –

8
sed '1,/pattern/d' file 

działa na Twój przykład.

sed '0,/pattern/d' file 

jest bardziej niezawodny.

+2

Tak. Chyba że "wzór" zostanie znaleziony w pierwszej linii. Lepiej zacząć od zakresu w '0'. – Birei

+0

@ Birei ładna sugestia. ! – Kent

+0

Pamiętaj jednak, że gdy wzorzec nie zostanie znaleziony, spowoduje to usunięcie wszystkiego. –

2

Kolejny sed rozwiązanie:

sed ':loop;/pattern/{d};N;b loop' file.txt 
+0

To wydaje się być jedynym rozwiązaniem, które nie usuwa wszystkiego, gdy wzór nie zostanie znaleziony. –