2010-04-12 4 views
5

Mam plik, który jest podobną do tego:Bash: (? Może sed) Extract Zakres Przy regularnym Expressioin

<many lines of stuff> 
SUMMARY: 
<some lines of stuff> 
END OF SUMMARY 

chcę wyodrębnić tylko rzeczy między SUMMARY i END OF SUMMARY. Podejrzewam, że mogę to zrobić z sed, ale nie jestem pewien jak. Wiem, że mogę zmodyfikować rzeczy pomiędzy tymi słowami:

sed "/SUMMARY/,/END OF SUMMARY/ s/replace/with/" fileName 

(Ale nie wiem, jak to wydobyć).

Jestem Bash na Solaris.

Odpowiedz

8
sed -n "/SUMMARY/,/END OF SUMMARY/p" fileName 
+1

pasuje to również: .... PODSUMOWANIE .... KONIEC STRESZCZENIE Dodawanie '^' wymagać dopasowania ciąg NULL na początku przestrzeni Wzór: sed -n „/^STRESZCZENIE /,/^ END OF SUMMARY/p " –

+1

Jeśli to zrobisz, prawdopodobnie dobrym pomysłem będzie dodanie końca znacznika końca linii.Tzn .: sed -n "/^PODSUMOWANIE $ /,/^ KONIEC PODSUMOWU $/p" ' – sixtyfootersdude

1

Jeśli Perl jest w porządku, można użyć:

perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);' 
+0

Tak, lubię perl zbyt ale mój zespół jest bardziej seddy ludzie. – sixtyfootersdude

+0

Ja też lubię Perla, ale ten naprawdę brzmi bardziej jak praca dla sed. –

0

Można to zrobić z awk:

$ echo 'many 
lines 
of 
stuff 
SUMMARY: 
this is the summary 
over two lines 
END OF SUMMARY' | awk ' 
    BEGIN    {e=0} 
    /^END OF SUMMARY$/ {e=0} 
         {if (e==1) {print}} 
    /^SUMMARY:$/  {e=1}' 

która wyprowadza:

this is the summary 
over two lines 

nie wszystkie implementat jony z awk będą wymagały klauzuli BEGIN, ale zawsze lubię włączać jawną inicjalizację.

Działa przy użyciu flagi echa (e), aby zdecydować, czy jesteś w sekcji podsumowania, czy nie.

1

Jeśli nie chcesz drukować linie markera:

sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename 
0

Solaris, należy nawk

#!/bin/bash 
nawk ' 
/SUMMARY/{ 
gsub(".*SUMMARY:",""); 
f=1 
} 
/END OF SUMMARY/{f=0; 
gsub("END OF SUMMARY.*","") 
}f' file 

wyjście

$ cat file 
1 2 3 <many lines of stuff> 
4 5 6 SUMMARY: 7 8 9 
<some lines of stuff> 
END OF SUMMARY blah 
blah 

$ ./shell.sh 
7 8 9 
<some lines of stuff> 
1

To powinno działać stosując (FreeBSD) także sed:

sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt 
+0

Jaka jest przewaga tego nad' sed -n '/^PODSUMOWANIE $ /,/^ END OF SUMMARY $/p "nazwa_pliku"? – sixtyfootersdude

0

Tu jest jeszcze inna sed wersja po prostu robi odcisk wielu linii & zakończyć (co może być korzystne dla wydobywania zakres linii z dużego pliku):

sed -E -n -e '/^SUMMARY:$/{n;h;};/^END OF SUMMARY$/!H;/^END OF SUMMARY$/{g;p;q;}' fileName | sed 1d 

Dla multi-line sed skryptu dość dobrze wyjaśnione patrz:

http://ilfilosofo.com/blog/2008/04/26/sed-multi-line-search-and-replace/

+0

Hum. Rzuciłem okiem na ten punkt odniesienia, ale nadal uważam, że lepiej jest zastępować za pomocą zakresu niż buforów. Interesuje Cię, czy/dlaczego uważasz, że bufory są lepsze. – sixtyfootersdude