Pregunta

este es mi archivo de texto de muestra:

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

para el que quiero o / p como:

asdas

this should be there

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

Intenté usar sed

  

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

Pero de alguna manera no produjo la salida correcta. La segunda etiqueta que contenía & Quot; & Gt; & Quot; el símbolo falló en la expresión regular. ¿No está seguro de a dónde me estoy equivocando?

¿Alguna idea de cómo hacerlo?

¿Fue útil?

Solución

Si está intentando eliminar líneas con el texto literal 'TAG', intente:

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

De sus comentarios, parece que TAG puede no ser literal, en cuyo caso:

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

Esto se puede simplificar usando un delimitador diferente:

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

Otros consejos

En lugar de usar la solución sed que le di, es posible que le guste cualquiera de estos en perl y awk:

perl -ne 'print if !( m@//<<<TAG@ .. m@//TAG>>>@ )'
awk '/\/\/<<<TAG/,/\/\/TAG>>>/ {next} 1'

Dado que creo que realmente no quieres que TAG sea una constante, la solución más limpia que conozco es la variante perl:

perl -ne 'print if !( m@^//<<<(.*)@ .. m@^//$1>>>$@ )'

Además, los delimitadores de búsqueda en sed se pueden cambiar escapando del primer delimitador:

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

Versión Awk que coincide con el final con el mismo nombre de etiqueta:

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top