Domanda

questo è il mio file di testo di esempio:

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

per cui voglio o / p come:

asdas

this should be there

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

Ho provato a usare sed

  

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

Ma alcuni non hanno prodotto un output corretto. Il secondo tag che conteneva & Quot; & Gt; & Quot; simbolo non riuscito in regex. Non sei sicuro di dove sbaglio?

Qualche idea su come farlo?

È stato utile?

Soluzione

Se stai cercando di eliminare le righe con il testo letterale 'TAG', prova:

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

Dai tuoi commenti, sembra che TAG potrebbe non essere letterale, nel qual caso:

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

Questo può essere semplificato usando un delimitatore diverso:

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

Altri suggerimenti

Invece di usare la soluzione sed che ho dato, potresti apprezzare uno di questi in perl e awk:

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

Dato che penso che tu non voglia davvero che TAG sia una costante, la soluzione più pulita che conosco è la variante perl:

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

Inoltre, i delimitatori di ricerca in sed possono essere modificati sfuggendo al primo delimitatore:

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

La versione Awk corrisponde alla fine con lo stesso nome tag:

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top