2010-10-15 7 views
0

En fait, j'ai un problème très complexe, mais je l'ai réduit ici à la partie la plus essentielle avec quelques données fictives.Regex pour ajouter des lignes de texte supplémentaires entre certaines lignes?

Dire que j'ai le texte suivant:

a 
aa 
aaa 
aaaa 
aaaa 
aaaaa 
a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
aaaa 
a 

Ce que je voudrais faire est, par exemple lorsqu'une ligne de 4 a de est suivie d'une ligne de 1 a. Je voudrais ajouter une ligne de 3 a de après la ligne de 4, et ajouter une ligne de 2 a de après la ligne de 3. Ainsi, le résultat serait:

a 
aa 
aaa 
aaaa 
aaaa 
aaaaa 
aaaa 
aaa 
aa 
a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
aaaaa 
aaaa 
aaa 
aa 
a 

J'ai essayé le regex folowing en EditPad:

find: \r?\n(a*)aa\r?\n\1\r?\n 
repl: \n\1aa\n\1a\n\1\n 

Mais cela ne fonctionne que lorsque la ligne suivante a exactement 2 une est inférieure à la précédente .. Je sais que je pourrais écrire un tas d'expressions régulières comme celle-ci, à travailler pour la différence de 2 a, 3 a, 4 a, 5 a et ainsi de suite. Mais j'aimerais avoir une seule regex. Cela ne me dérange pas si je devrais exécuter cette regex plusieurs fois si ..

+0

Dans votre exemple, vous avez dit, « quand une ligne de 4 a de est suivie d'une ligne de 1 a », mais vous avez dit plus tard, « Mais cela ne fonctionne que lorsque la ligne suivante a exactement 2 a de moins que la précédente ". Je ne comprends pas. Vous devriez reformuler votre question clairement. Je suis sûr que beaucoup de gens ici sont confus comme moi. – Vantomex

+0

ouais, c'était un exemple. Ce que je voulais dire, c'est que si j'ai 4 a suivi de 1 a, je veux ajouter une ligne de 3 a et une ligne de 2 a entre ces lignes. Donc ce que je veux faire est d'ajouter des lignes avec des a pour que chaque ligne en ait exactement une de moins que la précédente, sauf si la ligne a plus de a que la précédente. Donc ce que je voulais dire par "ceci ne fonctionne que lorsque la ligne suivante a exactement 2 a moins que le précédent" est que j'ai un script qui ajouterait une ligne de 3 a entre une ligne de 4a suivie d'une ligne de 2 a. Je sais que ce n'est pas très bien formulé mais il suffit de regarder l'exemple –

Répondre

0

Je viens de trouver une solution moi-même. On dirait que j'étais très proche, juste un peu trop avec les sauts de ligne au début.

find: (a*)aa\r?\n\1\r?\n 
repl: \1aa\n\1a\n\1\n 

Cela fonctionne après que je clique plusieurs fois sur 'replace all' dans editpad pro. Je voudrais avoir une solution où je dois exécuter le remplacer une seule fois, donc s'il y a d'autres pensées, s'il vous plaît faites le moi savoir

0

Si vous enregistrez vos données fictives dans un fichier appelé file, enregistrez le programme gawk(1) suivant Comme un fichier appelé runme et invoquez-le à partir du shell comme gawk -f runme file, il devrait aboutir à la sortie désirée.

Notez que le programme imprime les lignes nouvellement produites comme une série de hachages au lieu de a pour illustrer les ajouts.

BEGIN { } 

{ 
    if (NR==1) { print $0; oldrec = $0; } 

    if (NR>1) { 
      levelsdiff = length(oldrec) - length($0); 

      if (levelsdiff>1) { 
        newrecs = levelsdiff - 1; 
        i = 1; 
        while (newrecs>0) { 
          newline = ""; 
          hashes = length(oldrec) - i; 
          while (hashes!=0) { 
            newline = newline "#"; 
            hashes--; 
          } 
          print newline; 
          i++; newrecs--; 
        } 
      } 

      if (levelsdiff<1) { 
        newrecs = -levelsdiff - 1; 
        i = 1; 
        while (newrecs>0) { 
          newline = ""; 
          hashes = length(oldrec) + i; 
          while (hashes!=0) { 
            newline = newline "#"; 
            hashes--; 
          } 
          print newline; 
          i++; newrecs--; 
        } 
      } 

      print $0; 
      oldrec = $0; 
    } 
} 

END { } 

Sorties:

a 
aa 
aaa 
aaaa 
aaaa 
aaaaa 
#### 
### 
## 
a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
##### 
aaaa 
### 
## 
a 
+0

c'est génial, mais n'implique pas regex. Je cherche une expression régulière à utiliser dans editpad pro –