2009-08-03 4 views
14

questo è il mio campione file di testo:multilinea sed sostituire

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

per il quale voglio o/p come:

 
asdas 

this should be there 

Fondamentalmente Im cercando di trovare linee tra "// < < >> "(comprese anche queste righe) ed eliminali.

Ho provato ad utilizzare sed

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

Ma in qualche modo non ha prodotto l'uscita corretta. Il secondo tag che conteneva il simbolo ">" non è riuscito nell'espressione regolare. Non sai dove sto andando male?

Qualche idea su come farlo?

+0

nell'output, sei sicuro di voler una riga vuota tra asdas e 'questo dovrebbe essere lì'? –

risposta

10

Se si sta tentando di eliminare le linee con il testo letterale 'TAG', provare:

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

Dai vostri commenti, sembra che TAG non può essere letterale, nel qual caso:

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

Questo può essere semplificato utilizzando un delimitatore diverso:

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

Le ricerche Google per "one-liner sed" spesso sono molto utili - http://sed.sourceforge.net/sed1line.txt dovrebbe essere uno dei primi risultati e contiene questo uno tra molti altri. – Cascabel

0

Inoltre i delimitatori di ricerca in sed può essere cambiato sfuggire il primo delimitatore:

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

versione Awk le partite alla fine con lo stesso nome di tag:

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

proverà ... – rbawaskar