2009-08-03 9 views
14

to jest mój przykładowy plik tekstowy:sed multiline zastąpić

 
asdas 
//<<<TAG 
this should be removed 
//TAG>>> 
this should be there 
//<<<TAG 
T 
> 
asd 
asd 
//TAG>>> 

dla których chcę O/P jako:

 
asdas 

this should be there 

Zasadniczo im próbuje znaleźć granicę między „// < < >> "(również te linie) i je usunąć.

że próbuje za pomocą sed

sed -n '1H: 1H;! $ {G S /// < <] * >>> TAG // g; p;}' < test.txt

Ale niektóre, w jaki sposób nie wyprodukowały prawidłowego wyniku. Drugi znacznik zawierający symbol ">" nie powiódł się w wyrażeniu regularnym. Nie jestem pewien, gdzie się mylę?

Każdy pomysł, jak to zrobić?

+0

W swoim wyjściu, jesteś pewien, że chcesz pusty wiersz między asdas i „powinien być tam”? –

Odpowiedz

10

Jeśli próbujesz usunąć linie z tekstem dosłownym „TAG”, spróbuj:

 
sed '/\/\/<<<TAG/,/\/\/TAG>>>/d' 

Od swoich uwag, wydaje się, że tag nie może być dosłowne, w którym to przypadku:

 
sed '/^\/\/<</,/^\/\/.*>>/d' 

to można uprościć przez użycie innego ogranicznika:

sed '@^//<<<@,@^//.*>>>@d' 
+4

Wyszukiwania Google dla "sed one-liners" często są bardzo pomocne - http://sed.sourceforge.net/sed1line.txt powinien być jednym z pierwszych wyników i zawiera ten jeden spośród wielu innych. – Cascabel

0

Ponadto separatory wyszukiwania w sed mogą być zmieniane przez ucieczkę pierwszego separatora:

sed '\|^//<<<|,\|^//.*>>>|d' file 

wersja awk dopasowuje koniec o tej samej nazwie znacznika:

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file 
+0

wypróbuje ... – rbawaskar