2009-12-01 9 views
4

Comment puis-je commenter des lignes à partir d'un certain motif et N lignes à partir?Commenter N lignes avec sed/awk

int var1; 
int var2; 
int var3; 
int var4; 
int var5; 

Je veux commenter 3 lignes dont var2 (et non en fonction de leur contenu!):

int var1; 
// int var2; 
// int var3; 
// int var4; 
int var5; 

Répondre

0

Le script awk suivant peut faire ce que vous demandez:

echo 'int var1; 
int var2; 
int var3; 
int var4; 
int var5; 
' | awk ' 
    /^int var2;$/ { 
     count = 3; 
    } 
    { 
     if (count > 0) { 
      $0 = "//"$0; 
      count = count - 1; 
     }; 
     print; 
    }' 

Cette sortie:

int var1; 
//int var2; 
//int var3; 
//int var4; 
int var5; 

La façon dont cela fonctionne est relativement simple. La variable de compteur c décide du nombre de lignes restant à commenter. Il commence par 0, mais lorsque vous trouvez un motif spécifique, il est mis à 3.

Ensuite, il commence à décompter, affectant autant de lignes (y compris celle qui l'a mis à 3).

Si vous n'êtes pas inquiet pour la lisibilité, vous pouvez utiliser la plus courte:

awk '/^int var2;$/{c=3}{if(c>0){$0="//"$0;c=c-1};print}' 

Soyez conscient que le compte sera remis à zéro chaque fois que le modèle se trouve. Cela semble être la façon logique de manipulation:

int var1;  ---->  int var1; 
int var2;    //int var2; 
int var3;    //int var3; 
int var2;    //int var2; 
int var3;    //int var3; 
int var4;    //int var4; 
int var5;    int var5; 

Si c'est pas ce que vous vouliez, remplacer count = 3; avec if (count == 0) {count = 3;}; ou de l'utilisation:

awk '/^int var2;$/{if(c==0){c=3}}{if(c>0){$0="//"$0;c=c-1};print}' 

pour la version compacte.

0

également ce script:
sed -i '2,4 s:^://:' test.txt

test.txt:

 
int var1; 
int var2; 
int var3; 
int var4; 
int var5; 

sortie:

 
int var1; 
//int var2; 
//int var3; 
//int var4; 
int var5; 
+0

"à partir d'un certain modèle" –

+0

ohh j'ai manqué ça ... !! – sud03r

5

Cela nécessite GNU sed

sed '/^int var2;$/,+2 s.^.//.' 
0
awk '/var2/{c=3}c-->0{ $0="//"$0}1' file 
+0

Aussi: 'awk '/ var2/{c = 3} c -> 0 {printf" // "} 1' fichier' –

3

GNU awk (peut-être d'autres awks aussi) a tendance varie:

gawk '/var2/, c==2 {$0 = "//" $0; c++} { print }' file.c 

ou écrit lisiblement:

/var2/, c == 2 { 
    $0 = "//" $0 
    c++ 
} 

{ 
    print 
} 

Edit:

awk --posix '/var2/, c++ == 2 {$0 = "//" $0} { print }' 

œuvres, donc je pense que les gammes font partie de la spécification AWK. Vous pouvez également placer l'incrément dans le motif de plage pour enregistrer certaines frappes.

Il applique la première action aux lignes, y compris celle qui correspond à var2, et après jusqu'à c == 2. Il applique le deuxième motif à chaque ligne.

+0

Le vôtre fonctionne également avec' --traditional' –

+0

+1 pour la lisibilité – Idelic

Questions connexes