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