2010-04-30 4 views
2

Salut Je souhaite supprimer une ligne en utilisant sed si elle correspond à 2 expressions régulières dans la même ligne. Par exemple, la ligne commence par/* et se termine par */(commentaire). Le script suivant fera la plupart de cela. Sed -e '/ ^/*/d' -e '/ */$/d' Ce script supprimera toutes les lignes commençant par * et se terminant par * /. Je le veux pour enlever la ligne seulement si répond aux deux critères pas un.SED: Correspondance sur 2 modèles sur la même ligne

Répondre

2

Essayez

sed '/^\/\*.*\*\/$/ d' filename

La clé ici est que vous pouvez sorta combiner deux motifs regex en un seul, simplement en les reliant avec .*, qui correspond à « un certain nombre de caractère ». Bien sûr, cela impose un ordre entre les deux. Le premier motif ^\/\* doit apparaître avant le second \*\/$ pour que ce motif particulier corresponde.

En outre, depuis * a une signification particulière dans regex, assurez-vous d'échapper à vos astres, tout comme vous devez échapper à vos barres obliques.

0

Supprime toutes les commentaires multilignes ainsi

par exemple

# cat file 
blah blah /* comment */ 
words1 
words2 
/* multiline 
    comments 
/* 
end 

$ awk -vRS='*/' '{ gsub(/\/\*.*/,""); }1' file 
blah blah 

words1 
words2 

vous pouvez ajouter un autre filtre à sed 's|\/\/.*||' pour filtrer // commentaires et

0

Pour votre problème, vous pouvez faire quelque chose le long des lignes recommandées par @echo. Cependant, si vous avez besoin d'une solution plus générale, par exemple, où les expressions rationnelles ne sont pas ancrées à une extrémité de la ligne ou à l'autre, ou peuvent être dans l'ordre de la ligne, ou même se chevaucher, vous aurez quelque chose comme le script sed suivant:

/regexp1/! b notboth 
/regexp2/! b notboth 
:both 
# sed commands if both patterns match 
n 
:notboth 
# sed commands if at least one pattern doesn't match 
n 

Ceci utilise les capacités de branchement de sed. La commande b se connecte à l'étiquette nommée si la correspondance de modèle réussit, et le suivi ! sur le motif inverse le sens de la correspondance. Donc, à peu près,

Mettez cela dans un fichier, disons foo.sed, et exécutez-le comme sed -f foo.sed.

Questions connexes