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?
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