2009-08-03 12 views
14

c'est mon fichier texte exemple:multiligne sed remplacer

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

pour laquelle je veux o/p comme:

 
asdas 

this should be there 

Fondamentalement im essayant de trouver des lignes entre « // < < >> "(y compris ces lignes aussi) et les supprimer.

J'ai essayé avec sed

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

Mais certains comment il n'a pas produit une sortie correcte. La deuxième balise contenant le symbole ">" a échoué dans regex. Je ne sais pas où je vais mal?

Une idée de comment le faire?

+0

Dans votre sortie, êtes-vous sûr que vous voulez une ligne vide entre asdas et «cela devrait être là? –

Répondre

10

Si vous essayez de supprimer des lignes avec le texte littéral « TAG », essayez:

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

De vos commentaires, il semble que TAG ne peut pas être littérale, auquel cas:

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

Cela peut être simplifiée en utilisant un séparateur différent:

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

Les recherches de Google pour "sed one-liners" sont souvent très utiles - http://sed.sourceforge.net/sed1line.txt devrait être l'un des premiers résultats, et contient celui-ci parmi beaucoup d'autres. – Cascabel

3

plutôt que d'utiliser la commande sed solution que j'ai donné, vous pourriez aimer l'un de ces en Perl et awk:

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

Étant donné que je pense que vous ne voulez vraiment pas TAG être une constante, la solution la plus propre que je connaisse est la variante perl:

 
perl -ne 'print if !([email protected]^//<<<(.*)@ .. [email protected]^//$1>>>[email protected])' 
0

en outre la recherche délimiteurs sed peut être changé en échappant à la première delimiter:

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

la version Awk les matches de la fin avec le même nom de tag:

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

va essayer ... – rbawaskar

Questions connexes