2012-04-08 4 views
2

Gestern habe ich versucht, alle () in meinem Text zu ersetzen, aber nicht das in Übereinstimmungen von einer früheren Suche gefunden. Ich konnte keine gute Lösung finden. Ich habe es einzeln geändert.Ersetze bestimmte Zeichen, aber nicht das in Übereinstimmungen gefunden

Dies ist mein ursprünglicher Text:

(Peter Jackson) is the man who..... (John Johnson) is the man who.... 
and (John Johnson) is also the man who.. not as (Jon Johnson) 
more (letters) etc. 

Meine Suchmuster: /(\a*\sJohnson)
Wie kann ich alle () Zeichen im Text zu [] ersetzen, aber nicht die, in Übereinstimmungen gefunden ?

sollte das Ergebnis sein:

[Peter Jackson] is the man who..... (John Johnson) is the man who.... 
and (John Johnson) is also the man who.. not as (Jon Johnson) 
more [letters] etc. 

bearbeiten
Gibt es eine einfache Methode, einen oder mehrere unabhängig von Zeichen in einem Text zu ersetzen, aber nicht diese in Streichhölzer?

+0

ich Ihre Frage bearbeitet habe. Ist es das, was du meinst? – kev

+0

Du hast es gut gemacht. Ja das ist was ich meine. Ich würde gerne einen (allgemeinen) Weg finden, um es das nächste Mal schneller zu machen, als was ich getan habe. – Reman

Antwort

1

One das folgende Substitutions Befehl verwenden können, um den Zweck in Frage zu erreichen.

:%s/(\(.\{-}\%(IGNORE.\{-}\)\@<!\))/[\1]/g 

wo IGNORE das Muster bezeichnet, die nicht in Klammern überein, dass zu ändern sind (\a*\sJohnson, zum Beispiel).

Um ein generelles Problem der Substitution von überall in Puffer außer in den Spielen von IGNORE Mustern zu lösen, kann man mit dem Befehl

:%s/\(IGNORE\)\zs\|s/\=submatch(1)!=''?'':'t'/g 
+0

ib, wenn '\ a * \ sJohnson' ist meine Suche und ich möchte alle Zeichen im Text in Leerzeichen sauf' \ a * \ sJohnson' ersetzen oder ich möchte alle 's' im Text in 't' ändern sauf das 's' in Matches, was wäre der Regex? – Reman

+0

@Remonn: Werfen Sie einen Blick auf die aktualisierte Antwort. Wenn der Befehl, den ich hinzugefügt habe, das Problem löst (ich bin nicht sicher, ob ich es richtig verstanden habe), werde ich die Beschreibung ausarbeiten. –

+0

ib, Danke.Ich habe versucht, Sie ohne Erfolg Code. Füllen p.e. 3 Zeilen mit dem Zeichen "a" und setzen Sie das Wort "try" in die Zeilen (den ignorierten Text) und versuchen Sie, alle "r" durch "b" zu ersetzen. Ich kann es nicht funktionieren lassen. Vielleicht habe ich etwas falsch gemacht. – Reman

2

können diese Arbeit:

:%s/(\(\a*\sJohnson\))/LEFTPARENT\1RIGHTPARENT/g 
:%s/(/[/g 
:%s/)/]/g 
:%s/LEFTPARENT/(/g 
:%s/RIGHTPARENT/)/g 
3

Sie \@! (Negative Lookahead) verwenden können:

:%s/(\%(\a*\sJohnson\)\@!\([^)]*\))/[\1]/g 
    ->|............|<--- 
  • \%(...\)\@! ist ein Negative Lookahead.
  • \([^)]*\) wird alles außer ) übereinstimmen.
  • Ich benutze \%( ein aufgenommenes Gruppe zu ignorieren, sonst müssen Sie /[\2]/
+0

Schön, das wäre viel einfacher als das, was ich getan habe, aber wie würden Sie p.e. alle "s" in einem Text ersetzen, aber nicht in Übereinstimmungen? – Reman

Verwandte Themen