Verwenden Sie Regex im "Ersetzen" -Teil einer Suche / Ersetzen?

1010
Torben Gundtofte-Bruun

Ich habe eine große Menge von Tabulator-eingerückten (umrissenen) Text, dem ein führendes Aufzählungszeichen fehlt:

 some point a sub-point 

Ich möchte jede Registerkarte durch 2 Leerzeichen ersetzen und einen Bindestrich voranstellen. Dies ist das Zielformat, das ich brauche:

 - some point - a sub-point 

Suchen:
Ich kann den Regex verwenden \t+\S, um "eine beliebige Anzahl von Registerkarten zu finden, gefolgt von einem Nicht-Whitespace". Dies funktioniert gut und die "Suchen" -Funktion markiert den Anfang jeder Zeile bis hin zum ersten Nicht-Tabulator-Zeichen.

Ersetzen:
Wie kann ich Regex verwenden, um anzugeben, dass "jeder Tabulator durch zwei Leerzeichen, gefolgt von einem Bindestrich und einem Leerzeichen, gefolgt vom ursprünglichen Nicht-Tabulatorzeichen" ersetzt werden muss? Speziell:

  1. Wie kann ich angeben, dass die Ersetzung so oft erfolgen soll, wie es Treffer in der Suche gab? (Drei Registerkarten würden also zu sechs Stellen werden usw.)
  2. Wie kann ich das Literal "einen Bindestrich, dann ein Leerzeichen" angeben?
  3. Wie kann ich angeben, dass das Nicht-Tab-Zeichen unverändert bleiben soll?

Mein Google-Fu hat mich zu dem Konzept von geführt,\1 aber ich sehe nicht, wie ich das nutzen kann. Meine Testversuche führten nur zu Fehlern.
Update:
entdeckte ich eine Sache über \1: Ich muss Klammern in meine verwenden find string: (\t+)(\S)und verwenden Sie dann, dass in der ersetzen Teil: \1- \2. Dies hilft mir, die Punkte Nr. 2 und Nr. 3 oben zu lösen, aber um Platz 1 bin ich immer noch ratlos!
Up-Update:
Duh - # 1 kann eine einfache Suchen / Ersetzen-Aktion ohne Regex sein, solange im Text keine Tabulatorzeichen vorhanden sind. Das muss ich jetzt untersuchen!

Ich versuche es mit Ubuntus Gedit, aber ich könnte auch Notepad ++ oder Sublime verwenden, wenn Sie Editor-spezifische Vorschläge haben.

2
Wie ich sehe, haben Sie einige Updates gemacht, während ich meine Antwort gepostet habe. Ich hoffe du hast es geklärt. Wenn ja, lass es uns wissen. LPChip vor 6 Jahren 0

2 Antworten auf die Frage

1
LPChip

Es gibt zwei Methoden, die Sie verwenden können.

Sie können nach der gesamten Zeichenfolge suchen + was danach kommt, und Gruppierungen verwenden, um sie durch eine oder mehrere Gruppen zu ersetzen, jedoch nicht alle. Hier kommt $1oder \1kommt es ins Spiel.

Sie können auch nur nach dem Teil suchen, den Sie ersetzen möchten, und einfach durch etwas anderes ersetzen.

Erstellen Sie zuerst die Regex, die Sie explizit ersetzen möchten, und suchen Sie danach. Wenn Ihre Suche nach mehreren Teilen einer Zeichenfolge sucht und Sie etwas in der Mitte behalten möchten, ist eine Gruppierung erforderlich. Beispiel: Suchen Sie nach [b]text[/b]und ersetzen Sie es mit<b>text</b>

Dein Regex wäre so etwas \[b\](.+)\]\/b\]und ersetze es mit<b>\1</b>

Wenn Sie nur jeden Text, der eine fortlaufende Zeichenfolge ist, ändern müssen, können Sie gezielt danach suchen und ihn ersetzen. Suchen Sie beispielsweise nach          -My exampleund ersetzen Sie es mit  - My example(was im Wesentlichen alle Tabulatoren für zwei Leerzeichen ersetzt und nach dem - ein Leerzeichen hinzufügt.) Sie würden es suchen \t+-und durch ersetzen -

Der Regex bedeutet hier: Suchen Sie nach Tabulatoren, die ein- oder mehrmals vorkommen, gefolgt von einem Hypen. Wenn Sie nach dieser Zeichenfolge suchen, ohne sie tatsächlich zu ersetzen, werden Sie feststellen, dass der Text ausgewählt wird, den Sie ersetzen möchten.

Wenn Sie einen Tab mit zwei Leerzeichen \tersetzen möchten, suchen Sie ihn einfach und ersetzen ihn durch 

Beachten Sie, ich habe ein Leerzeichen gefolgt von einem Alt + 255 überall in diesem Beitrag verwendet, um 2 Leerzeichen hintereinander einzugeben. Andernfalls verdichtet SuperUser alles auf 1 Leerzeichen.

Vielen Dank, dass Sie die Verwendung von "\ 1" geklärt haben. In meinem Fall beginnt jede Zeile mit beliebigen Wörtern, sodass ich Ihrer "Mein Beispiel" -Idee nicht folgen kann. Torben Gundtofte-Bruun vor 6 Jahren 0
Ja, du kannst. Diese Wörter werden bei der Suche einfach übersprungen. LPChip vor 6 Jahren 0
1
Toto

Sie können dies mit Notepad ++ in zwei Schritten tun:

Erster Schritt:

  • Ctrl+H
  • Finde was: \t
  • Ersetzen durch:    (2 Leerzeichen)
  • Aktivieren Sie die Option Wrap around
  • Überprüfen Sie den regulären Ausdruck
  • Replace all

Zweiter Schritt:

  • Finde was: ^\h+
  • Ersetzen mit: $0-
  • Aktivieren Sie die Option Wrap around
  • Überprüfen Sie den regulären Ausdruck
  • Replace all

Erläuterung:

^ : beginning of line \h+ : 1 or more horizontal spaces 

Ersatz:

$0 : the whole match (ie. all the spaces at the beginning of each line) - : a dash followed by a space 
Diese Antwort gefällt mir besonders, weil sie sich auf den "Anfang der Zeile" konzentriert, so dass ich mich nicht mehr mit dem ersten Nicht-Leerzeichen beschäftigen muss, und außerdem eine klare und präzise Erklärung. Torben Gundtofte-Bruun vor 6 Jahren 1