2009-06-24 6 views
2

Ich habe mich nur gefragt, ob jemand könnte helfen, wie Sie die folgenden mit vi.vi Suche Kopie Paste Suche Kopie

Ich habe eine Textdatei, und es könnte so etwas wie

start of text file: 
--something1.something2-- 
--anotherThing1.something2-- 
end of text file: 

enthält Wenn ich diese Zeile nehmen will und wandle es durch für etwas von der Suche nach dem ersten Vorkommen von [A-Za-z0-9] Kopie, die in den Puffer passenden dann hängen sie ihn auf der gleichen Zeile vor dem ersten occurrent von -

start of text file: 
--something1.something2.something1-- 
--anotherThing1.something2.anotherThing1-- 
end of text file: 

gibt es einen einzigen VI Befehl, dies zu tun?

Prost Ben

+0

Sie wollen also das erste Wort nach '-' bis zum ersten 'kopieren.' und anhängen '.' und das Wort vor dem letzten '-' gefunden? – stefanB

Antwort

5
:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/gc 

oder ohne Bestätigung für jeden zu fragen ersetzen:

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/g 

produzieren:

--something1.something2.something1-- 
--anotherThing1.something2.anotherThing1-- 

aus:

--something1.something2-- 
--anotherThing1.something2-- 

Dies ist, wenn Sie das erste Wort nach '-' bis zum ersten 'kopieren möchten.' und anhängen '.' und Wort gefunden vor dem letzten '-'.

Verwendung von vim.

RE KOMMENTAR:

Jemand erwähnte, dass es nicht funktionieren wird, wenn es mehrere Wörter sind und so weiter. Getestet habe ich es auf der folgenden:

start of text file: 
--something1.something2.something3.something4.something5.something6-- 
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5-- 
end of text file: 

, nachdem sie mit dem obigen Ausdruck ersetzen:

start of text file: 
--something1.something2.something3.something4.something5.something6.something1-- 
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5.anotherThing1-- 
end of text file: 
+1

Entfernen Sie das "c" vom Ende, wenn Sie nicht aufgefordert werden sollen, jeden Austausch zu bestätigen. –

+0

Der Modifikator/g für die Regex ist nicht erforderlich. Ihre Regex funktioniert nicht, wenn mehrere Vorkommen von --text.text-- in einer Zeile vorhanden sind. – user55400

+0

Was meinst du mit --text.text-- ... hast du ein Beispiel, das scheitert? – stefanB

1

Heilige Scheiße, in der Zeit, es hat mich einzuloggen, dass die Antwort zu schreiben, geschrieben Sie es und schon Ich habe einen Kommentar erhalten!

%s/--\(\w*\)\.\(.*\)--/--\1.\2.\1--/g 

--ab1.cd2..yz99-- -> --ab1.cd2..yz99.ab1--

+0

Ich testete es tatsächlich zuerst vor dem Posten ... – stefanB

1

Versuchen Sie folgendes:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g 
0

Aufbauend auf StefanB Lösung aber mit negierte Zeichenklassen und die „sehr Magie“ -Einstellung, erreiche ich die folgende Substitution Befehl:

:%s/\v--([^.]+)\.(.*)--/--\1.\2.\1--/ 

Je nach den genauen Anforderungen (was chara erlaubt cters für "something1" und "anotherThing1") könnte dies korrekter sein oder auch nicht.

Noch eine Sache zu beachten: Alle bisherigen Lösungen gehen davon aus, dass es nur ein Auftreten des "--text.someOtherText-- Patterns pro Zeile gibt. Ist dies nicht der Fall, wird der (. *) Teil von das Muster müsste angepasst werden und der Modifikator/g wird benötigt.

+0

Ich habe tatsächlich getestet mit mehreren Segmenten wie "--anotherThing1.etwas2.anotherThing1.anotherThing1.anotherThing1--" wird es füge noch das erste Wort vor dem letzten hinzu - – stefanB