Notepad++ ist ein kostenloser Texteditor. Er unterstützt verschiedene Programmiersprachen, um Quelltext einfach zu bearbeiten. Ähnlich wie in Entwicklungsumgebungen erfolgt der Einsatz von typografischen Mitteln. Dies bedeutet, dass der Text in seinem Aussehen formatiert wird. Die Formatierung ist abhängig von der Syntax und der Struktur der Programmiersprache. Notepad++ kann reguläre Ausdrücke (sogenannte RegExp) in der “Suchen und Ersetzen” Funktion verarbeiten. Ein Anwendungsfall regulärer Ausdrücke können Wildcards sein, auf die wir gleich zu sprechen kommen.
Übersicht
Der Artikel ist aufgrund der Beispiele etwas länger geworden. Mithilfe der Links gelangen Sie zu den einzelnen Punkten.
Suchen und ersetzen
Die “Suchen und Ersetzen” Funktion kann in Notepad++ über zwei Wege erreicht werden:
- Möglichkeit:
Unter dem Punkt “Suchen” in der Menüleiste, kann der Listeneintrag “Ersetzen …” ausgewählt werden. Anschließend öffnet sich das gewünschte Fenster. - Möglichkeit:
Die einfachere Möglichkeit besteht darin, gleichzeitig STRG+H zu drücken. Anschließend öffnet sich auch hier das gewünschte Fenster.
Wildcards
Wildcards bezeichnen Platzhalter für andere Zeichen. In der “Suchen und Ersetzen” Funktion in Notepad++ ist es möglich, diese zu verwenden. Im Folgenden werden die wichtigsten Wildcards aufgelistet und deren Einsatz beschrieben. Die Tabelle zeigt die Schreibweise in Notepad++. Hier werden häufig vor Verwendung einer Wildcards ein “.” benötigt.
Wildcard | Beschreibung |
---|---|
.? oder . | Ein Fragezeichen sucht nach genau einem Zeichen (Character). |
.* | Ein Sternchen sucht nach einer beliebigen Anzahl an Zeichen (auch null). |
[] | Es wird nur nach Zeichen gesucht, die in den eckigen Klammern stehen. Die alleinige Verwendung der eckigen Klammern entspricht keinem gültigen Ausdruck.
Zeichen: Zahlen: Beliebige lateinische Buchstaben oder beliebige Ziffern: Zeichen ausschließen: |
Quantoren
Der Verwendung von Quantoren ist optional. Sie erweitern Wildcards und erlauben es, Wiederholungen in Zeichenketten zu finden. Die Syntax lautet:
<Wildcard><Quantor>
Quantor | Beschreibung |
---|---|
? | Erweitert man eine Wildcard um ein Fragezeichen, muss dieser Ausdruck nicht vorkommen, er kann aber. |
+ | Das Pluszeichen bedeutet, dass der voranstehende Ausdruck mindestens einmal vorkommen muss, aber beliebig oft wiederholt werden darf. |
* | Der voranstehende Ausdruck darf beliebig oft vorkommen. Anders als das Pluszeichen darf der Ausdruck auch keinmal vorkommen. |
{n} | Der voranstehende Ausdruck muss exakt n-mal vorkommen. |
{n,} | Der voranstehende Ausdruck muss mindestens n-mal vorkommen. |
{n,m} | Der voranstehende Ausdruck muss zwischen n-mal und m-mal vorkommen. |
{0,m} | Der voranstehende Ausdruck darf maximal m-mal vorkommen. |
Sucht man beispielsweise nach [ab]{2}_ erhält man: “aa”, “bb”, “ab” und “ba”. Wildcards und Quantoren können beliebig kombiniert werden.
Metazeichen
Metazeichen haben in einem bestimmten Kontext eine besondere Bedeutung für die Verarbeitung von Zeichenketten. Bei der Verwendung von regulären Ausdrücken, wie es bei der “Suchen und Ersetzen” Funktion von Notepad++ der Fall ist, haben folgende Metazeichen eine besondere Bedeutung:
Metazeichen | Beschreibung |
---|---|
^ | Dieses Metazeichen steht für einen Zeilen- oder String-Anfang |
$ | Ein Dollar-Zeichen steht für ein Zeilen- oder String-Ende |
? + * { } | Finden bei Wildcards und Quantoren Verwendung |
\ | Wandeln ein Metazeichen in ein “normales” Zeichen um, um danach suchen zu können. |
( ) | Gruppierungen, um komplexes “Suchen und Ersetzen” zu ermöglichen. Möchte man zwischen zwei Zeichen z. B. “<” und “>” einen beliebig langen Text finden und die zwei Zeichen anschließend entfernen, eignet sich die Verwendung von runden Klammern. Diese werden auch Tagged Expressions genannt. Innerhalb einer Suche können mehrere Tagged Expressions verwendet werden. Im Ersetzen-Teil wird mit den Tags \1_, \2_, usw. darauf zugegriffen. Auf erste Klammer kann dann z. B. mit dem Tag \1_ aufgerufen werden.
Der Suchausdruck könnte dann wie folgt aussehen: <(.*)>_. Es wird also nach beliebig vielen Zeichen zwischen dem Größer- und Kleiner-Zeichen gesucht. Im Ersetzen-Teil wird dann geschrieben \1_. Die Suche wird dadurch durch den Inhalt der Klammern ersetzt, also den beliebigen Zeichen. |
| | Alternativen oder auch logisches “ODER” |
\n | Neue Zeile “line feed” |
\r | Neue Zeile “carriage return” |
\t | Tabulator |
\d | Ein beliebiges Digit |
\w | Ein beliebiger Buchstabe |
\s | Ein Leerzeichen (Whitespace) |
\b | Leere Zeichenkette am Wortanfang oder am Wortende |
\B | Leere Zeichenkette, die nicht den Anfang oder das Ende eiens Wortes bildet |
Beispiel: Payload aus einem Daten-Stream erhalten
Die Suche von Notepad++ ist sehr effizient. Zeichnet man Log-Dateien einer seriellen Datenübertragung auf und sucht nach speziellen Paketen, kann diese perfekt eingesetzt werden. Nachrichtenpakete bestehen oft aus einem Start-Byte, einem Befehl, der Payload, einer Checksumme und einem Stopp-Byte.
Start-Byte | Befehl | Paketzähler | Payload | Checksumme | Stopp-Byte |
---|---|---|---|---|---|
0x01 | 0x12 | 1 Byte | 3 Byte | 2 Byte | 0x04 |
In diesem Beispiel möchten wir aus einem seriellen Daten-Stream die Payload erhalten. Jede Payload soll in einer neuen Zeile ausgegeben werden, um die Daten einfacher lesen zu können. Die Aufzeichnung schaut zunächst so aus:
Die gesamte Aufzeichnung wird nur in einer Zeile dargestellt, was sehr unleserlich ist. Wir wissen aber, dass jedes Paket mit dem Stopp-Byte 0x04 endet. Wir können deshalb das Zeichen 0x04 mit 0x04\n ersetzen. \n ist ein Line-Feed, also ein Zeilenumbruch. Notepad++ nimmt diese Sonderzeichen im erweiterten Suchmodus an. Das Ersetzen schaut wie folgt aus:
Jedes Nachrichtenpaket erscheint nun in einer neuen Zeile.
Im nächsten Schritt entfernen wir das Start-Byte, den Befehl und den Paketzähler von der Payload. Das Start-Byte und der Befehl variieren in diesem Beispiel nicht, der Paketzähler wird in jeder Zeile inkrementiert. Die Suche muss deshalb lauten 01 12 .?.?_.
Der Nachrichtenanfang wurde nun erfolgreich entfernt:
Nun wird nur noch das Nachrichtenende entfernt. Dieses besteht aus einer 2-Byte langen Checksumme und dem Stopp-Byte. Die Suche lautet deshalb .?.? .?.? 04_. Nach diesem Schritt bleibt nur noch die Payload übrig und das gewünschte Ergebnis wurde erzielt.
Und das Ergebnis:
Beispiel: Text innerhalb eines <div>-Tags ersetzen
In diesem Beispiel soll gezeigt werden, wie zum Beispiel der Text von HTML-Buttons einfach geändert werden kann. Auf einer Webseite sind mehrere Buttons mit der ID “test” eingebunden. Die Texte sind unterschiedlich, sollen aber auf “mehr erfahren” umgestellt werden. Der Code sieht wie folgt aus:
Auch wenn Zeile 2 und 3 auf den ersten Blick gleich aussehen, erkennt man, dass in Zeile 3 ein zusätzliches Leerzeichen vorhanden ist und der Text zwischen den Divs länger ist. Der Suchausdruck muss deshalb so aussehen:
Das Resultat:
Beispiel: Unterseiten von URLs entfernen
In diesem Beispiel werden die Unterseiten von URLs entfernt. Die vorhandene Liste sieht so aus:
medtech-ingenieur.de/index.php medtech-ingenieur.de/?p=3133&preview=true medtech-ingenieur.de/blog/ medtech-ingenieur.de/dependability-in-der-medizintechnik/
Jede Unterseite kann mit dem Befehl “de/.*” gefunden werden. Diese ersetzt man dann durch “de/” oder “de”. Achten Sie darauf, dass der Haken bei “findet \r und \n” nicht gesetzt ist.
Das Ergebnis ist dann:
medtech-ingenieur.de medtech-ingenieur.de medtech-ingenieur.de medtech-ingenieur.de
Beispiel: Werte aus Klammern parsen
Beim Debuggen kommt es schonmal vor, lange Arrays genauer zu betrachten. Kopiert man die Werte direkt aus der Entwicklungsumgebung, werden oft die Zeilenangaben und weitere Informationen mit übertragen. Die Kopie könnte für einen Ringpuffer so aussehen (kopiert aus Android Studio):
Interessant für den Entwickler sind in diesem Fall nur die Hexadezimal-Werte. Außerdem möchte er sehen, welche Nachrichten in diesem Ringpuffer gespeichert sind. Mit nur einem Befehl schafft man es, alle Werte in einer Zeile darzustellen. Die Verwendung der runden Klammern wird auch Tagged Expression oder Gruppierung genannt. Mithilfe des Tags \1 kann auf den Inhalt der ersten Klammer in der Suche zugegriffen werden. Die Abfrage sieht wie folgt aus:
Hier ist das Ergebnis zu sehen:
Der Entwickler weiß, dass jedes Nachrichtenpaket mit 0xFD endet. Im nächsten Schritt können wir deshalb eine neue Zeile (\n) nach jedem 0xFD einfügen. Zu sehen sind dann alle Nachrichtenpakete im Ringpuffer.
Beispiel: Datum einheitlich formatieren
Eine Liste mit mehreren Daten ist unterschiedlich formatiert. Mit der “Suchen und Ersetzen” Funktion von Notepad++ sollen alle Daten in das Format “##-##-####” umgewandelt werden. Die Liste sieht wie folgt aus:
Im ersten Schritt ersetzen wir alle Zeichen zwischen den Zeilen durch das Zeichen “-“. Die Verwendung von Tagged Expressions kann innerhalb der Suche mehrmals erfolgen. Auf die einzelnen Klammern kann dann durch die Tags \1, \2, usw. zugegriffen werden. Die Zahl spiegelt die Reihenfolge der Klammern wieder.
Das Ergebnis des ersten Durchlaufs sieht wie folgt aus:
Leider haben nun noch nicht alle Daten das gewünschte Format “##-##-####”. Deshalb muss ein zweiter Durchlauf mit der folgenden Suche durchlaufen werden:
Anschließend erhält man das gewünschte Format.
Haben Sie noch Fragen oder wünschen Sie sich weitere Beispiele? Dann hinterlassen Sie doch ein Kommentar. Wir helfen Ihnen gerne weiter.
Viele Grüße
Daniel Saffer
Guten Morgen,
ich habe diesen sehr interessanten Artikel gelesen. Nun stehe ich vor dem folgenden Problem: Ich habe eine kleine Textdatei mit ca. 4400 Zeilen, die in etwa so aussieht:
*TEXT TEXT\r\n
\r\n
text text text text text text text text text text text text\r\n
\r\n
text text text\r\n
\r\n
*TEXT\r\n
\r\n
text text text\r\n
\r\n
text text text text text\r\n
\r\n
text text text text text text\r\n
\r\n
*TEXT\r\n
\r\n
text text\r\n
\r\n
text text text text text text text text text text text text\r\n
\r\n
Hierbei möchte ich alle Zeilen, welche nicht (Leerzeichen)*TEXT\r\n enthalten einfach komplett löschen, so dass nur die unzähligen Keywords ” *TEXT\r\n” übrig bleiben. Die Platzhalter TEXT und text stehen hierbei für eine beliebig lange Zeichenkette aus Buchstaben in GROßBUCHSTABEN oder eine Mischung aus Groß- und Kleinbuchstaben (a.k.a. sog. “Wörter”). Mit den o.g. Wildcards muss das noch irgendwie funktieren? Nur wie?
Viele Grüße Sebastian
Hallo,
super Artikel, nur habe ich das Problem das ich im ersetzen Feld keine Reg Ex nutzen kann.
Ich versuche volgendes:
123 Abc …
234 Bcd …
… in
123;Abc …
234;Bcd …
zu ändern,
ich kann mit \d\d\d\s oder \d\s\w das Leer zeichen identifizieren, aber es ist immer noch das drumherum was auch ersetzt wird was ich nicht will. Generell möchte ich das erste Leerzeichen einer Zeile er setzen. Zeilen beginnen immer mit einer 2 oder 3 Stelligen Zahl, dann folgt ein Leerzeichen und danach Text der auch Leerzeichen enthält die ich aber nicht ändern will.
Vielleicht weiss ja jemand Rat, Danke vielmals.
Habs noch hinbekommen,
Suchen: (\d\d\d)(\s)(\w)
ersetzen: \1;\3
\1 … bezieht sich auch einen Klammerausdruck
Hallo
Das meiste bekomme ich (vor allem mit den Erklärungen aus den Fragen inzwischen gut hin)
Was ich aber noch nicht hinbekommen habe ist eine Quasi Formatierung in einer Zeile.
Mein Programmcode ist mit Tabs formatiert, damit z.B. nach einem Gleichheitszeichen die Ausdrücke an der gleichen Stelle stehen. Das hilft mir bei der Fehlersuche.
Wenn ich mir den Quelltext jetzt aber mit einem anderen Programm anschauen muss (zb. Lister von Total Commander oder bei einem Kollegen, der nicht npp benutzt oder andere Tab-Breiten bevorzugt), dann ruscht diese Formatierung komplett weg. Gibt es eine Möglichkeit Tabs so durch Leerzeichen zu ersetzen, dass der nachfolgende Text an der gleichen Stelle bleibt?
Hallo liebe Community,
es freut uns sehr, dass so viele User diesen Blog lesen. Wir können leider nicht mehr auf alle Kommentare antworten. Gerne können aber Fragen in den Kommentaren durch andere User beantwortet werden. Wir hoffen auf euer Verständnis und wünschen euch weiterhin viel Erfolg beim suchen und ersetzen mit Notepad++.
Schau mal hier vorbei: https://www.it-swarm.com.de/de/notepad%2B%2B/konvertieren-sie-tabulatoren-leerzeichen-notepad/958205873/#:~:text=Wie%20konvertiere%20ich%20Tabulatoren%20in%20Leerzeichen%20in%20Notepad%20%2B%2B%3F&text=Um%20vorhandene%20Tabulatoren%20in%20Leerzeichen,Settings%2D%3EPreferences…
Da ist gut erklärt, wie Tabs durch Leerzeichen ersetzt werden können.
Hallo Daniel, endlich eine Seite die super verständlich ist: DANKE!!!
Ich hätte aber trotzdem eine große Bitte:
Versuche folgendes in Notepad++ zu erreichen:
suche nach
A12345
soll mit
a12345 name
ersetzt werden wobei 12345 sich ständig ändert.
Vielleicht findest du Zeit mir eine Lösung dafür zu zeigen:
Vielen Dank
Viele Grüße
Andreas
Hallo Andreas,
soll das “a” beim Ersetzen wirklich kleingeschrieben werden? Wenn nicht, kannst du die folgenden Befehle verwenden:
Suchen nach: ([a,A][0-9]{5})_
Ersetzen durch: \1 DEIN_TEXT_
Kurze Erklärung:
[a,A]_: Sucht zu Beginn des Ausdrucks nach einem kleinen oder großen “A”. Kann natürlich beliebig bearbeitet werden. Du kannst auch das kleine “a” weglassen.
[0-9]{5}_: Suche nur nach numerischen Zeichen, die genau eine Länge von 5 Zeichen haben.
(..)_: Die Klammern können verwendet werden, um den gefundenen Ausdruck wieder im “Ersetzen durch”-Bereich mit “\1” auszugeben.
Ersetze “DEIN_TEXT” durch deinen beliebigen Text, der immer dahinter erscheinen soll.
Viele Grüße
Daniel
Lieber Daniel,
ich hätte eine Frage an dich. Wenn ich in Manuskripten nach “fortfolgend” suchen möchte, abgekürzt mit f oder ff, und ein Leerzeichen hineinersetzen möchte, zwischen jeweiliger Ziffer und “ff”, dann gelingt mir mit der Platzhaltersuche nie, dass die letzte jeweilige Ziffer auch wirklich stehen bleibt. Diese wird einfach verschluckt und das Leerzeichen hinzugefügt. Weißt du eventuell, woran das liegen kann? Es macht mich noch ganz narrisch. Das Gleiche passiert übrigens, wenn ich fehlende Punkte am Ende des Fußnotensatzes ergänzen lassen möchte. Wonach ich suche: “[(0-9)]ff”, womit ich zu ersetzen versuche und scheitere: “\1 ff”
Liebe Grüße und schönen Abend
Hallo,
du hast die Klammer “()” an der falschen Stelle positioniert. Probiere nach ([0-9])ff zu suchen, dann sollte es funktionieren. Die eckigen Klammern schränken ein, wonach du suchen möchtest, also nach numerischen Zeichen. Die normale Klammer erstelle eine Gruppierung. Du möchtest alle gefundenen numerischen Zeichen gruppieren, deshalb diese außerhalb der eckigen Klammern.
Viele Grüße
Daniel
Servus, Daniel!
Ich nochmal. Ich hab jetzt entdeckt, dass man im NP++ den Suchmodus “Reguläre Ausdrücke” wählen muss, damit das funktioniert.
Mit RegEx hatte ich bisher noch keine Erfahrungen, weshalb ich nicht wusste, dass es etwas damit zu tun hat…
Jetzt bekomm ich das jedenfalls wunderbar hin. Vielen Dank für dieses Tutorial.
cu
Davero
Hallo Davero,
Super! Schön, dass es geklappt hat.
Viele Grüße
Daniel
Hallo, Daniel!
Das wär mal eine tolle Seite, wenn das auch funktionieren würde. Bei meinem NP++ 7.9.1×64 tut es das leider nicht.
Ich versuche in einer XML-Datei folgendes zu ersetzen
2021-.?.?-.?.? in 2021-04-01
Meldung von NP++: Can’t finde the text “2021-.?.?-.?.?”
Hat Notepad++ diese Funktion entfernt?
Jedenfalls schöne Feiertage und Danke!
cu
Davero
Doch tut es, du must nur den richtigen regulären Ausdruck benutzen! Schau mal:
-> “.?” bedeutet _irgendein_ Zeichen, oder auch keins
Warum?
Darum:
-> “.” steht für genau _ein_ Zeichen — egal welches
-> “?” ist (1) ein Quantifier (damit wird beschrieben, wie oft das gefunden werden soll, was _direkt_ davorsteht) und bedeutet (2) “null- oder einmal”
Ich gehe mal davon aus, dass du alle Datumsangaben im Format YYYY-MM-TT suchst. Das hieße, dass alle Ys, alle Ms und alle Ts _Ziffern_ sind.
_Eine_ Ziffer wird gefunden von “\d” oder “[0-9]”. Du kannst also z.B. folgendes machen:
-> suchen nach: 2021-\d\d-\d\d
-> ersetzen mit: 2021-04-01
Falls du auf die Sichernummer gehen willst, musst du dich daran erinnern, dass der 1.Mai von manchen Spaßvögeln auch “2021-5-1” geschrieben wird. Dafür könntest einen anderen Quantifier benutzen: “+”, der bedeutet “das, was direkt davor steht bitte ein- oder mehrmals finden”. Ergo:
-> suchen nach: 2021-\d+-\d+
-> ersetzen mit: 2021-04-01
Wo wir schonmal dabei sind: Die letzte Suche hat ein schönes Problem, sie findet nämlich auch das “Datum” 2021-9654789-52. Besser wäre also das, von dem ich glaube, dass du es eigentlich vorhattest:
-> suchen nach: 2021-\d\d?-\d\d?
-> ersetzen mit: 2021-04-01
Perfekt wäre folgende Suche:
-> 2021-[01]?\d-[0-3]?\d\b
“2021-” : alle Treffer werden mit “2021-” beginnen; direkt danach
“[01]?” : kommt entweder “0” oder “1” (weil es ja nur 12 Monate gibt)
oder eben nix (wg. Mai=”5″) ; direkt danach
“\d-” : kommt irgendeine Ziffer, gefolgt von einem “-“; direkt danach
“[0-3]?” : kommt alles zwischen und inklusive “0” und “3” (also entweder
“0” oder “1” oder “2” oder “3”, weil es ja max. 31 Tage im
Monat gibt) oder eben nix (wg. Tag=”1″) und
“\d” : alle Treffer werden ganz hinten auf jeden Fall eine Ziffer
haben, denn direkt danach
“\D” : kommt irgendein Zeichen, das _keine_ Ziffer ist
Was du damit z.B. findest: 2021-05-11 2021-5-1 2021-12-7 2021-1-31
Was du damit leider auch findest: 2021-01-33 2021-18-15 2021-01-33 (*)
Was du damit aber wenigstens _nicht_ findest: 2021-55-1 2021–31 2021-24-11 2021-01-43
Was du damit vielleicht finden wolltest und aber _nicht_ findest: 2020-05-01
OK? Na aber gern…
Cheers, Nikolai
(*) Natürlich gibt’s auch dafür eine Lösung — das wäre dann aber sogar _mir_ zuviel des Guten.
-> 2021-(1[0-2]|0?\d)-(3[01]|[0-2]?\d)\D
Ja, ich weiß, der 30. Februar. Und, ja, natürlich gibt’s auch dafür…
@Davero : Sorry, mein Text ist ordentlich umformatiert worden — jetzt ist er nicht nur schwer zu verstehen, sondern auch noch schwer zu lesen… :(
Guten Tag Daniel
Ich muss diverse File miteinander vergleichen.
Dabei möchte ich divers Komentare löschen die nicht wichtig sind.
zBsp In der folgenden Zeile möchte ich , (* rConfigIx 2 *) bzw (* rConfigIx 4 *) löschen
FET_ReadVarConfigWithAdr (ADR(vDt.a.rNb.b), (* rConfigIx 2 *)
FET_ReadVarConfigWithAdr (ADR(vDt.a.rPm[1].b2), (* rConfigIx 4 *)
Habe es mit folgendem Eintag versucht:
\(* rConfigIx.*
Im gesammten File hat es mir rConfigIx mit der Laufnummer gelöscht
FET_ReadVarConfigWithAdr (ADR(vDt.a.rNb.b), (*
FET_ReadVarConfigWithAdr (ADR(vDt.a.rPm[1].b2), (*
aber (* nicht.
Wie kann ich auch (* löschen.
Besten Dank schon mal im voraus.
Gruss
Beat
Hallo Beat,
die Klammer und das Mal-Zeichen werden als Regex-Ausdruck verwendet. Wenn du wirklich nach dem Zeichen suchen möchtest, musst du ein Backslash davor schreiben (nur wenn “Reguläre Ausdrücke” in Notepad++ ausgewählt ist).
Deine Suche lautet dann:
\(\* rConfigIx [0-9] \*\)_
Viele Grüße
Daniel
Hallo Daniel,
ist es möglich Zeilen durch zu nummerieren?
Ich hatte was im Sinn mit:
Suche: (.+)
Ersetzten: ?? \1
Regular Expression
Die zwei ?? stehen als Platzhalter, ich möchte das jede Zeile eine Zahl voran gestellt bekommt. Zeile 1 mit 01., Zeile 2 mit 02. usw.
Hast du da eine Idee wie das am besten umzusetzen wäre?
Grüße
FreeFun
Hallo FreeFun,
für Notepad++ gibt es ein Plugin, um eine Nummerierung mit Regex-Ausdrücken durchführen zu können.
Dazu kannst du hier (https://stackoverflow.com/questions/14636539/lines-number-using-regex-in-notepad mehr nachlesen :).
Viele Grüße
Daniel
Hey Daniel,
das Plugin hatte ich schon gefunden, das ist leider nur mit der 32 Bit Version von Notepad++ Kompatibel. Ich hab gehofft eine eleganteren weg zu finden als zusätzlich zur 64 Bit Version auch noch 32 Bit zu installieren.
Grüße
FreeFun
Hallo FreeFun,
ich denke mit einem kleinen Bash- oder Shell-Script kannst du das viel einfacher lösen. Einfach deine Text-Datei einlesen, eine Variable inkrementieren und an deiner gewünschten Position einfügen.
Viele Grüße
Daniel
Hallo Daniel
Ist es möglich, mit Hilfe der RegEx in den untenstehenden Beispielblöcken die Werte 0.5 nach den Zeilen mit 41, 42 oder 43 zu ersetzen? Ich kann nicht einfach alle Werte 0.5 ersetzen, da der Wert 0.5 auch an einigen Stellen vorkommt, wo er nicht ersetzt werden darf. Im Block der mit AcDbBlockReference beginnt und wo danach die Werte 41, 42 und 43 stehen aber schon.
Ein Block beginnt immer mit AcDbBlockReference dann kommen Zeilen mit Zellenbezeichnung, Koordinaten die jeweils unterschiedlich sind. Am Ende der Zeilen ist jeweils immer ein CR und ein LF
————————- Beispielblock 1 ——————-
AcDbBlockReference
2
GPM
10
2679998.095
20
1225960.042
30
0.0
41
0.5
42
0.5
43
0.5
0
————————– Beispielblock 2 —————–
AcDbBlockReference
2
FLUSSR
10
2681218.581
20
1226226.94
30
0.0
41
0.5
42
0.5
43
0.5
50
————— Ende Beispielblock —————
Ich denke das ist schon eher was für RegEx Profis oder irre ich mich?
Beste Grüsse
Ray
Hallo Ray,
wenn ich dich richtig verstehe, möchtest du den Wert 0.5 nur dann entfernen, wenn in der vorherigen Zeile die Werte 41, 42, oder 43 standen.
Um das zu realisieren, suchst du nach (4[1-3])\n0\.5_ und ersetzt es durch \1_.
Kurze erklärung:
– ()_ die Klammern werden auch tagged expressions genannt. Du kannst durch das Einfügen von \1_ den Wert innerhalb der Klammer wieder einfügen.
– 4[1-3]_ verwenden wir, um die Zahlen 41, 42 und 43 zu suchen. Die 4 ist ein statischer Wert und der Ausdruck 1-3 bedeutet, dass alle Werte in diesem Bereich gesucht werden.
– \n_ ein Zeilenumbruch
– 0.5_ der Werte in der nächsten Zeile der ersetzt werden soll.
Ich hoffe, das hilft dir weiter!
Viele Grüße
Daniel
Hallo Daniel,
ich versuche gerade zum dritten Mal etwas zu posten und hoffe, dass meine anderen zwei Kommentare nicht mehr zu lesen sind, damit du nicht zu viele Nachrichten erhältst.
Zunächst Danke für die Beispiele. Diese haben mir sehr geholfen.
Allerdings habe ich noch eine Frage.
Beispiel:
G90 ; use absolute coordinates
N170 M82 ; use absolute distances for extrusion
N180 G92 E0
N190 ; Filament gcode
N200 ; Hier kann der Schrittmotor zurueck werden
N210 G1 Z0.400 F4800.000
N230 G1 X40.018 Y11.402
N240 G1 F1800.000
N260 G1 X40.802 Y9.901 E0.06759
N250 G1 X40.413 Y10.490 E0.03953
Problem: Ich möchte aus dem G-Code die Zahlenwerte mit dem Zeichen “E” entfernen.
Dies funktioniert beispielsweise mit E.* .
Allerdings entfernt er mir damit alle Kommentare mit dem Zeichen “e”.
Frage: Gibt es eine Möglichkeit die Zahlenwerte mit dem (Vor-)Zeichen “E” zu löschen, ohne die Kommentare zu verändern?
Gewünschte Lösung:
G90 ; use absolute coordinates
N170 M82 ; use absolute distances for extrusion
N180 G92
N190 ; Filament gcode
N200 ; Hier kann der Schrittmotor zurueck werden
N210 G1 Z0.400 F4800.000
N230 G1 X40.018 Y11.402
N240 G1 F1800.000
N260 G1 X40.802 Y9.901
N250 G1 X40.413 Y10.490
Hallo Daniel,
vielen Dank für Deine Erklärungen!
Sie sind sehr gut zu verstehen.
Eine Sache, bzw. zwei habe ich allerdings nicht verstanden im Beispiel “Datum einheitlich formatieren”:
Im ersten Suchdurchlauf suchst Du nach Jahren, die zwei-, drei oder vierstellig sein können.
([0-9]{2,4})
und ersetzt das durch
\3|0
Was tut die Pipe mit der nachfolgenden Null da?
Ich habe es ausprobiert und überrascht* festgestellt (* hätte mir eigentlich klar sein sollen), dass sie 1:1 hinter das Datum geschrieben wird.
Demnach ist die Pipe Null ein Versehen, oder?
Und das Zweite:
Da Dein Beispiel keine zwei- und dreistelligen Jahresangaben enthält, ist es nicht nachvollziehbar, was in dem Fall passiert.
Ich habe auch das ausprobiert:
Das Jahr wird so übernommen, wie es dasteht. Aus 1.1.16 wird demnach 01-01-16 und aus 4/4/999 wird 04-04-999.
Soweit ist das korrekt, wenn man davon absieht, dass es nicht den Vorgaben eines vierstelligen Jahres entspricht.
Also eigentlich müsste man bei dreistelligen Jahreszahlen eine Null davor schreiben.
Und bei zweistelligen Jahreszahlen prüfen ob eine 19 oder eine 20 davor muss.
Doch, wie geht das?
Ein völlig falsches Ergebnis kommt aber bei meinem Geburtstag heraus.
Aus 26.1.70 wird 206-01-70.
Wenn ich im zweiten Durchgang noch auf einen Zeilenanfang prüfe
^([0-9][-])([0-9][-])([0-9]{2,4})
dann kommen zumindest der 1.1.16 und der 4/4/999 wieder korrekt an, während der 26.1.70 oder auch der 6-12-2020 ignoriert werden.
Auf der Suche nach der Lösung schwirrt in meinem Kopf das Schlagwort “Alternative Ausdrücke” herum.
Doch während ich durchaus eine Idee hätte, wie man das im “Suchen”-Feld schreiben müsste fehlt mir die Ahnung, wie das im “Ersetzen”-Feld geht, völlig.
Welche Lösung gäbe es für das Problem?
Hallo Frank,
danke für deinen Hinweis. Die 0 sollte da nicht stehen. Ich bessere das im Beispiel aus.
Man könnte die Suche wie im Beispiel in mehrere Teilsuchen untergliedern. Im ersten Schritt vereinheitlichst du die Trennzeichen. Danach überprüfst du, ob es Tage, Monate oder Jahre mit zu wenigen Stellen gibt. Die Überprüfung, ob eine 19 oder 20 bei zweistelligen Jahreszahlen davor geschrieben werden muss, ist denke ich nicht möglich.
Ich habe meine Suche angepasst:
### ([0-9]{1,2})[.,/,-]{1}([0-9]{1,2})[.,/,-]{1}([0-9]{1,4})\n ###
Mit dieser sollte es bei deinem Geburtstag keine Probleme mehr geben. Ich habe vergessen das Zeilenende oder den Zeilenanfang zu suchen, was in diesem Beispiel natürlich Sinn ergeben würde.
Wahrscheinlich tust du dir in deinem Fall einfacher, ein kleines Python-Skript zu schreiben. Auch in Python gibt es Regex-Ausdrücke. Du kannst dann bei einem Match eine von dir definierte Funktion aufrufen, in der deine Logik enthalten ist. Oder du interpretierst den String direkt als Datum und formatierst ihn dann.
Ich hoffe, die Antwort hilft dir weiter.
Viele Grüße
Daniel
Hallo.
Erstmal: Super Erklärung, hat mir schon viel geholfen, vielen Dank.
Nun meine Frage:
Kann man beim Ersetzen von Zahlen auch Rechenoperationen nutzen?
Also z.B. ersetze alle 2.?.?.?, wobei es sich um eine 4stellige 2000er Zahl handelt, um 10 erhöht. Also:
2011->2021
2099->2109
etc
Hallo Carsten,
es gibt leider keine Möglichkeit, eine Addition innerhalb der Regex durchzuführen.
Möchtest du das dennoch in Notepad++ realisieren, kannst du dir das Python-Plugin herunterladen und ein kleines Skript schreiben. Verwende dort die Funktion “.rereplace()”.
Viele Grüße
Daniel
Die Seite hat mir sehr geholfen, aber ich bin auf ein Problem gestoßen. Beim Ersetzten kann man ja bei Gruppierungen bei Ersetzen mit \1 oder \2 arbeiten. Aber, was muss man schreiben, wenn man mehr als 9 Gruppierungen verwendet. Denn wenn ich beim Ersetzenfeld \10 schreibe, wird die erste Gruppierung geschrieben und eine “0” drangehängt.
Ich habe die Lösung gefunden. Statt “\” “$” schreiben, dann geht es.
Hallo Stephan,
vielen Dank für deine Antwort! Schön, dass es nun funktioniert.
Viele Grüße
Daniel
Hallo Daniel,
gibt es auch die Möglichkeit, das Folgende zu tun:
immergleicher_text(unterschiedlicher_text)
ersetzen durch:
unterschiedicher_text
Also: immergleicher_text und die umschließenden Klammern weg.
Einfach nur Kammern entfernen ist nicht die Lösung.
Es darf zwingend nur die schließende Klammer entfernt werden, wenn führend ‘immergleicher_text’ steht.
Das Folgende habe ich probiert:
immergleicher_text(*)
Ersetzen durch
*
geht nicht :-)
Herzlichst,
Ingo
Hallo Ingo,
die richtige Suche sieht wie folgt aus:

Du musst den Ausdruck “unterschiedlicher_text” einklammern, dann kannst du ihn im Ersetzen-Teil mit \1 einfügen.
Die Klammern, nach denen du suchen willst, benötigen ein Backslash, da sie sonst falsch interpretiert werden.
Viele Grüße
Daniel
Hallo
ich habe vollgendes Problem:
ich habe grosse XML Dateien in denen ich viele Daten auskomentieren muss und möchte mit suchen und ersetzen
Reihen auskomentieren :
suchen Anhand der Nummer z.B. 131448541
ersetzen den string mit # am anfang für auskomentiert
#paper.name.131448541=345_S_MC ! 32x45_BB
zb.
#paper.name.131448541=285_S ! 32x45_BB
paper.name.131448541=345_S_MC ! 32x45_BB
paper.width.131448531 = 45000
paper.height.131448531 = 32000
ergebnis:
#paper.name.131448541=285_S ! 32x45_BB
#paper.name.131448541=345_S_MC ! 32x45_BB
#paper.width.131448531 = 45000
#paper.height.131448531 = 32000
Vielen Dank für die Unterstützung
Gruss
Hansi
Hallo Hansi,
ja, das ist möglich. Ich habe dir einen Screenshot von der Suche gemacht:

.{0,30} bedeutet, dass nach maximal 30 beliebigen Zeichen am Zeilenanfang gesucht werden soll. Falls das vorherige größer sein sollte, kannst du die 30 natürlich durch eine größere Zahl ersetzen.
Das Gleiche habe ich auch nochmal für das Zeilenende gemacht. Zeilen werden mit einen Carriage Return (\r) und einem Line Feed (\n) abgeschlossen. Das hilft, um nach einer vollständigen Zeile zu suchen.
Die Zahl, in dem Fall “131448541”, kann durch eine Beliebige ersetzt werden.
Wie du außerdem sehen kannst, ist der gesamte Ausdruck eingeklammert. Dies hat zur Folge, dass wir im Ersetzen-Teil \1 schreiben können. Der Inhalt der Klammer wird dann wieder an dieser Stelle eingefügt. Da du die Zeile auskommentieren möchtest, musst du noch die Raut hinzufügen “#”.
Viele Grüße
Daniel
Hallo Daniel,
sehr interessant Deine Seite. Vielleicht kannst Du mir weiterhelfen.
Ich suche Möglichkeit, viele Daten automatisiert zu suchen und zu ersetzen. Zum Beispiel: Suche nach dem Platzhalter_1 in Zeile_1 und ersetze ihn durch Platzhalter_2 in Zeile_2, suche nach dem Platzhalter_3 in Zeile_3 und ersetze ihn durch Platzhalter_4 in Zeile_4, …
Suche_nach_[Platzhalter_1]
Ersetze_durch_[Platzhalter_2]
Suche_nach_[Platzhalter_3]
Ersetze_durch_[Platzhalter_4]
Suche_nach_[Platzhalter_5]
Ersetze_durch_[Platzhalter_6]
Suche_nach_[Platzhalter_7]
Ersetze_durch_[Platzhalter_8]
…
…
…
Siehst Du hier eine Möglichkeit? Oder eine andere Lösung?
Grüße
Stephan
Hallo Stephan,
vielen Dank!
Wie können die Platzhalter identifiziert werden? Stehen die z. B. immer am Zeilenende? Gibt es also eine gewisse Regelmäßigkeit der Daten?
Wenn das Zutrifft, könnte es funktionieren. Mit einem exakteren Beispiel könnte ich dir besser weiterhelfen.
Viele Grüße
Daniel
Ja, das habe tatsächlich etwas unklar ausgedrückt.
https://cdn.chimpify.net/5de18090a85872c6418b456b/2020/09/Beispiel_Notepad.jpg
Kurz zur Erklärung:
Ich habe den Quelltext einer Webseite (rechts im Bild). Dieser Quelltext ist immer gleich. Nur die Platzhalter müssen gesucht und ersetzt werden. Zum Beispiel Bilder, Links, Alt-Attribute, Texte.
Links im Bild die Platzhalter, die gesucht und ersetzt werden sollen.
Nach Zeile 1 wird gesucht und durch Zeile 2 ersetzt.
Nach Zeile 3 wird gesucht und durch Zeile 4 ersetzt. usw.
Damit man hier nicht 50x Suchen und Ersetzen manuell eingeben muss, suche ich nach einer Lösung das zu automatisieren.
Siehst Du hier vielleicht eine Möglichkeit?
Hallo Stephan,
ich habe viel darüber nachgedacht aber noch keine passende Lösung gefunden.
Ich mache mir nochmal Gedanken und wenn mir etwas einfällt, poste ich es hier. :)
Viele Grüße
Daniel
Hallo,
ich habe eine Frage zu folgendem Textfile:
m m
J
H 60,+3,T
O R
S l1;.0,-2,5.5,8.5,13.0,15.0,3
T:MATNR;5.4,1.0,.0,5,1.5;
T:AENNR;5.2,2.0,.0,5,1.2;
T:DATCODE;9.3,2.0,.0,5,1.2;
T:SERIAL;6.8,4.2,.0,5,1.2;[SER:,1,1]
T:AUFTRAG;6.0,3.1,.0,5,1.2;
B:BAR1;1.0,0.4,.0,DATAMATRIX,.21;[SER:,1,1]00000
A
Ich möchte nun die Koordinaten in der 5. Zeile, welche mit “S” anfängt ändern.
z.B.
S l1;.0,-2,5.5,8.5,13.0,15.0,3
in
S l1;.0,-1.5,5.5,8.5,13.0,15.0,3
Die Werte S l1; beginnt immer gleich, aber der Rest von der Zeile kann sich ändern.
Kann ich das mit Notepad++ mit Suchen/Ersetzen durchführen?
MfG
Markus
Hallo Markus,
ja, das geht.
Suche nach: (S l1;).*(\r\n)
Ersetze durch: \1HIER-DIE-KOORDINATEN\2
Bei HIER-DIE-KOORDINATEN, einfach deine Koordinaten eingeben.
Viele Grüße
Daniel
Hallo Daniel ,
d.h. Für die erste Koordinate nehme ich \1
Und für die letzte \7 zum Beispiel
\1 bedeutet, dass der Inhalt der ersten Klammer an der Stelle eingefügt werden soll.
Das Gleich gilt für \2.
HIER-DIE-KOORDINATEN kannst du durch deine Koordinaten austauschen.
Viele Grüße
Daniel
Hallo Daniel,
Das heißt ich muss immer die gesamten Koordinaten austauschen? Gibt es auch ne Möglichkeit eine bestimmte auszutauschen und den Rest belassen? Die Koordinaten sind immer mit Komma getrennt
Gruß
Markus
In dem Fall ersetzt es die gesamten Koordinaten. Wenn du das nicht möchtest, musst du die Klammern verschieben.
Viele Grüße
Daniel
Da sind gerade die Zeilen nicht angezeigt worden, vermutlich weil es html-tags sind.
Hier also noch einmal mein Problem:
Wie kann ich in mittels Notepad++, Ersetzen in Dateien zwischen 2 Zeilen eine weitere setzen? ich lasse jetzt die spizen Klammern am Beginn und Ende jeder Zeile weg.
Die beiden Zeilen sind:
head
title
Erhalten möchte ich:
head
meta charset=”utf-8″
title
Mit freundlichen Grüßen
Andreas
Hallo Andreas,
zuerst zeige dir alle nicht druckbaren Zeichen an, dann weißt du, welche Zeichen am Zeilenende stehen:

Hierdurch siehst du, ob ein “Line Feed (\n)” oder ein “Carriage Return (\r)” und ein “Linefeed (\n)” am Zeilenende stehen.
In meinem Beispiel sind beide Zeichen zu sehen.
Im nächsten Schritt suchen wir nach “head” und den Zeichen und ersetzen es durch “head” und der neuen Zeile (siehe folgendes Bild):

Das Ergebnis sieht dann so aus:

Ich hoffe, das hilft dir weiter!
Viele Grüße
Daniel
Hallo Daniel,
Danke, das hat geklappt. ich hatte nur \n probiert statt \r\n. Der Tipp mit den nicht sichtbaren Zeichen ist auch für andere Fälle gut.
Welche Version von Notepad++ benutzt du? (Ich hatte ein anderes, komplexeres Menü in Version 7.8.5)
Gruß
Andreas
Ich verwende noch Version 7.5.6.
Super, dass alles funktioniert!
Cool!
Danke!
Die Seite hat mir echt weiter geholfen!
Sie scheinen Fachmann zu sein, deshalb erlaube ich mir eine wohl banale Frage.
Gibt es eine Möglichkeit, dass notpad++ die Satzanfänge automatisch groß schreibt?
Sie würden mir mit einer Lösung sehr helfen.
Mit freundlichen Grüßen und schöne Weihnachten
Hallo Herr Speder,
automatisch geht das meines Wissens leider nicht. Allerdings kann man auch dies über Suchen und Ersetzen schnell lösen.
Im unten stehenden Screenshot sehen Sie die genauen Anweisungen:

Hierzu eine kurze Erklärung:
Es wird nach einem Zeilenumbruch (\n) und kleingeschriebenen Buchstaben ([a-z]) gesucht. Achten Sie darauf, dass der Haken bei Groß-/Kleinschreibung beachten gesetzt ist.
Anschließend ersetzen wir die Suche durch einen Zeilenumbruch \n, um die Formatierung beizubehalten, ein \U um die nachfolgenden Buchstaben großzuschreiben, dem \1 um den gesuchten Kleinbuchstaben umzuwandeln und abschließend ein \E, um die Umwandlung in Großbuchstaben zu beenden.
Ich hoffe, das hilft Ihnen weiter!
Mit freundlichen Grüßen und einen guten Rutsch ins neue Jahr!
Daniel Saffer
Schöne Beispiele! Was leider fehlt, ist die Erwähnung der tagged expressions. In eine Eingabe einfach “\1” für den zu ersetzenden Wert einzutragen, wirft eine ganze Menge neuer Fragen auf.
Vielen Dank für den Hinweis! Ich werde die Tagged Expressions noch in den Blog mit aufnehmen.
Viele Grüße
Daniel