2009-08-03 37 views
14

esto es mi muestra archivo de texto:multilínea SED reemplazar

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

por lo que quiero o/p como:

 
asdas 

this should be there 

im Básicamente tratando de encontrar entre líneas "// < < >> "(incluidas estas líneas también) y eliminarlos.

He intentado utilizar SED

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

Pero de alguna manera no se produjo una salida correcta. La segunda etiqueta que contenía el símbolo ">" falló en regex. ¿No estoy seguro de dónde me estoy equivocando?

¿Alguna idea de cómo hacerlo?

+0

En su salida, ¿está seguro de que quiere una línea en blanco entre asdas y 'esto debería estar ahí'? –

Respuesta

10

Si usted está tratando de eliminar las líneas con el texto literal 'TAG', prueba:

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

Desde sus comentarios, parece que la etiqueta puede no ser literal, en cuyo caso:

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

Esto se puede simplificar utilizando un delimitador diferente:

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

Las búsquedas en Google para "sed one-liners" a menudo son muy útiles - http://sed.sourceforge.net/sed1line.txt debería ser uno de los primeros resultados, y contiene este entre muchos otros. – Cascabel

0

Además los delimitadores de búsqueda en sed se puede cambiar al escapar el primer delimitador:

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

versión Awk los partidos al final con el mismo nombre de la etiqueta:

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

intentará ... – rbawaskar