Wildcards in Notepad++ – effizient suchen und ersetzen

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:

  1. 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.
  2. 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. Die Suche nach “A[bc]d” entspricht folglich: “Abd” und “Acd”. Es können auch Bereich angegeben werden. Sucht man beispielsweise nach B[a-c]A erhält man: BaA, BbA und BcA.

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

Ihr Ansprechpartner:

M.Eng. Daniel Saffer, Software-Entwickler
saffer@medtech-ingenieur.de
+49 9131 9115554

 

Benötigen Sie Unterstützung bei der Entwicklung Ihres Medizingeräts? Wir helfen gerne! Die MEDtech Ingenieur GmbH bietet Hardware-Entwicklung, Software-Entwicklung, Systems Engineering und Beratung aus einer Hand. Nehmen Sie Kontakt auf.

Kontakt aufnehmen

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

Auch interessant:

Einfache Erstellung einer GUI zum isolierten Testen von Hardware

Testen von frisch entwickelter Hardware kann manchmal ganz schön Zeit und Nerven aufreibend sein. Sobald mehrere Komponenten einer Einheit gleichzeitig entwickelt werden, bedarf es isolierter Tests, um alle Funktionen unabhängig…

Daniel Saffer

Seit April 2017 gehört Daniel Saffer zum MEDtech-Ingenieur Team. Aktuelle Aufgabengebiete umfassen die hardwarenahe Entwicklung in C und die Entwicklung einer skalierbaren GUI-Plattform für medizinische Geräte basierend auf Android.

Getagged mit: , , , , , , ,
15 comments on “Wildcards in Notepad++ – effizient suchen und ersetzen
  1. Avatar Markus sagt:

    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

      • Avatar Markus sagt:

        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

          • Avatar Markus sagt:

            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

  2. Avatar Anonymous sagt:

    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

  3. Avatar Anonymous sagt:

    Cool!
    Danke!

    Die Seite hat mir echt weiter geholfen!

  4. Avatar Bernhard Speder sagt:

    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:
      Notepad++ automatische Großschreibung bei Satzanfang.

      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

  5. Avatar Anonymous sagt:

    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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.