2011-01-09 3 views
1

Ich versuche, „/index.html“ zu einigen Ordnerpfaden in einer Liste wie folgt Hinzufügen anhängen:„/index.html“, um Pfade in Vim

path/one/ 
/another/index.html 
other/file/index.html 
path/number/two 
this/is/the/third/path/ 
path/five 
sixth/path/goes/here/ 

Offensichtlich ist der Text muss nur sein hinzugefügt, wo es noch nicht existiert.

:%s/^\([^.]*\)$/\1\/index.html/ 

Das einzige Problem ist, dass Sie diesen Befehl nach dem Ausführen, einige Zeilen wie die 1., 5. und 7. im vorherigen Beispiel mit duplizierten Schrägstrichen am Ende: Ich kann einige guten Ergebnisse mit (vim-Befehl) erreichen. Das ist auch einfach zu lösen, ich muss nur nach Duplikaten suchen und sie durch einen einzigen Schrägstrich ersetzen.

Aber die Frage ist: Gibt es keinen besseren Weg, um das richtige Ergebnis auf einmal zu erreichen?

Ich bin ein Vim Anfänger und kein Regex Master auch. Irgendwelche Tipps werden wirklich geschätzt!

Danke!

Antwort

4

So ganz in der Nähe :)

einfach eine optionale slash am Ende der Regex hinzufügen:

\/\? 

Dann brauchen Sie den Rest des Musters auf ein nicht gieriges Spiel zu ändern, so dass Es ignoriert einen Schrägstrich. Die Syntax für ein nicht gieriges Spiel in vim (als Ersatz für die *) ist:

\{-} 

So landen wir mit:

:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/ 

(Ist sicher zu sein nicht schaden und die Zeit zu entkommen.

)
+0

Vielen Dank Andrew!Ihre Erklärung war großartig und es funktioniert einwandfrei. – sidyll

+1

Dies ist ein idealer Zeitpunkt für die Verwendung der '\ v' Flag und Nicht-'/'Trennzeichen für die Lesbarkeit. ':% s @ \ v^([^.] {-}) /? $ @ \ 1/index.html @' –

1

Vims regex unterstützt die Fähigkeit, ein wenig Text foo übereinstimmen, wenn es tut oder nicht vorausgeht oder folgt einen anderen Text bar ohne bar passend, und das ist genau das, was Sie suchen. Hier wollen Sie das Ende der Zeile mit einem optionalen / abgleichen, aber nur, wenn auf / nicht folgt, und ersetzen Sie es dann durch /index.html. Ein kurzer Blick auf Vims Hilfe sagt mir \@<! ist genau was zu verwenden. Es sagt Vim, dass das vorhergehende Atom im Text sein muss, aber nicht in dem, was passt. Mit ein wenig Experimentieren, bekomme ich

:%s;/\?\(index\.html\)\@<!$;/index.html; 
  1. Ich benutze ; die Teile des :s Befehl zu begrenzen, so dass ich keine / in der Regex oder Ersatz Ausdruck zu entkommen. In dieser besonderen Situation ist es jedoch keine große Sache.

  2. Die / ist optional, und wir sagen so mit \?.

  3. Wir müssen index.html zusammen gruppieren, weil sonst unsere spezielle \@<! nur die l sonst beeinflussen würde.