This page has been robot translated, sorry for typos if any. Original content here.

Perl Regular Expressions Spickzettel

Nach Thema:


Kapitel 6.4. Reguläre Ausdrücke

6.4.1. Syntax für reguläre Ausdrücke

Reguläre Ausdrücke sind Muster, um nach bestimmten Kombinationen von Zeichen in Textstrings zu suchen und sie durch andere Kombinationen von Zeichen zu ersetzen (diese Operationen werden Mustererkennung bzw. -substitution genannt ). Der normale PERL-Ausdruck ist

  / Muster / Modifikatoren 

Hier ist Muster ein String, der einen regulären Ausdruck angibt, und Modifikatoren sind optionale Ein-Buchstaben- Modifikatoren , die die Regeln für die Verwendung dieses regulären Ausdrucks angeben.

Ein regulärer Ausdruck kann aus gewöhnlichen Zeichen bestehen; In diesem Fall entspricht es der angegebenen Kombination von Zeichen in der Zeichenfolge. Zum Beispiel entspricht der Ausdruck / cat / den ausgewählten Teilstrings in den folgenden Zeilen: " cat ok", "für cat ", "in der cat ". Die wahre Stärke von regulären PERL-Ausdrücken ergibt sich jedoch aus der Möglichkeit, spezielle Metazeichen in ihnen zu verwenden.

Tabelle 6.9. Regex Metazeichen
Symbol Beschreibung
\ Bei Zeichen, die normalerweise wörtlich interpretiert werden, bedeutet das, dass das nächste Zeichen ein Metazeichen ist. Zum Beispiel entspricht / n / dem Buchstaben n, und / \ n / entspricht einem Zeilenumbruchzeichen.
Bei Metazeichen bedeutet dies, dass das Zeichen wörtlich verstanden werden muss. Zum Beispiel bedeutet / ^ / den Anfang einer Zeile und / \ ^ / entspricht einfach dem Symbol ^. / \\ / entspricht dem umgekehrten Schrägstrich \.
^ Es entspricht dem Anfang der Linie (vgl. Modifikator m ).
$ Entspricht dem Ende der Zeile (vgl. Modifikator m ).
. Entspricht einem beliebigen Zeichen außer einem Zeilenumbruch (vgl. Modifikator s ).
* Passe das vorherige Zeichen null oder mehrmals an.
+ Passe das vorherige Zeichen ein oder mehrmals an.
? Stimmt mit der Wiederholung des vorherigen Zeichens null oder einmal überein.
( Muster ) Entspricht der Musterlinie und merkt sich die gefundene Übereinstimmung .
x | y Entspricht x oder y .
{ n } n ist eine nicht negative Zahl. Finde genau n Vorkommen des vorherigen Charakters.
{ n ,} n ist eine nicht negative Zahl. Passe n oder mehrere Vorkommen des vorherigen Zeichens an. / x {1,} / entspricht / x + /. / x {0,} / entspricht / x * /.
{ n , m } n und m sind nicht negative Zahlen. Entspricht mindestens n und höchstens m Vorkommen des vorherigen Zeichens. / x {0,1} / entspricht / x? /.
[ xyz ] Entspricht einem in eckigen Klammern eingeschlossenen Zeichen.
[^ xyz ] Entspricht einem beliebigen Zeichen außer in eckigen Klammern eingeschlossen.
[ a - z ] Entspricht einem beliebigen Zeichen im angegebenen Bereich.
[^ a - z ] Entspricht einem beliebigen Zeichen außer denen im angegebenen Bereich.
\ a Entspricht dem Glockensymbol (BEL).
\ A Findet nur den Anfang der Zeile, selbst mit dem Modifikator m .
\ b Entspricht der Wortgrenze, d. H. Der Position zwischen \ w und \ W in beliebiger Reihenfolge.
\ B Entspricht einer anderen Position als der Wortgrenze.
\ s X Entspricht dem Zeichen Strg + X. Zum Beispiel ist / \ cI / äquivalent zu / \ t /.
\ C Entspricht einem Byte, sogar mit der Anweisung utf8 .
\ d Entspricht der Nummer. Entspricht [0-9].
\ D Entspricht einem nicht numerischen Zeichen. Entspricht [^ 0-9].
\ e Entspricht dem Escapezeichen (esc).
\ E Das Ende der Transformationen \ L , \ Q , \ U.
\ f Entspricht dem Formatübertragungszeichen (FF).
\ G Entspricht der Position in der Zeile gleich pos () .
\ l Konvertiert das nächste Zeichen in Kleinbuchstaben.
\ L Konvertiert Zeichen in Kleinbuchstaben vor \ E.
\ n Entspricht Zeilenumbrüchen.
\ p Eigenschaft Entspricht Unicode-Zeichen mit Eigenschafteneigenschaft . Wenn die Eigenschaft aus mehreren Zeichen besteht, verwenden Sie die Syntax \ p { property } .
\ P Eigenschaft Entspricht Unicode-Zeichen, die keine Eigenschaft haben . Wenn eine Eigenschaft mit mehreren Zeichen angegeben wird, verwenden Sie die Syntax \ P { property } .
\ Q Hängt das "\" Zeichen vor den Metazeichen vor \ E.
\ r Entspricht dem Wagenrücklaufsymbol (CR).
\ s Entspricht einem Leerzeichen. Entspricht / [\ f \ n \ r \ t] /.
\ S Entspricht einem beliebigen Nicht-Leerzeichen-Zeichen. Entspricht / [^ \ f \ n \ r \ t] /.
\ t Entspricht dem Tab-Zeichen (HT).
\ u Konvertiert das nächste Zeichen in Großbuchstaben.
\ U Konvertiert Zeichen in Großbuchstaben vor \ E.
\ w Entspricht dem lateinischen Buchstaben, der Zahl oder dem Unterstrich. Äquivalent zu / [A-Za-z0-9_] /.
\ W Entspricht einem beliebigen Zeichen außer dem lateinischen Buchstaben, Ziffern oder Unterstrichen. Entspricht / [^ A-Za-z0-9_] /.
\ X Entspricht einer Folge von Unicode-Zeichen aus dem Hauptzeichen und einer Reihe akzentuierter Symbole. Äquivalent zu / C <(?: \ PM \ pM *)> /.
\ z Trifft nur das Ende der Zeile, selbst mit dem Modifikator m .
\ Z Stimmt nur mit dem Modifikator m am Ende einer Zeile mit dem Ende einer Zeile oder einem Zeilenumbruch überein.
\ n n ist eine positive Zahl. Entspricht der n-ten gespeicherten Teilzeichenfolge . Wenn die linke Klammer vor diesem Zeichen kleiner als n und n > 9 ist, entspricht es \ 0 n .
\ N n ist eine Oktalzahl nicht größer als 377. Entspricht dem Symbol mit dem Oktalcode n . Zum Beispiel ist / \ 011 / äquivalent zu / \ t /.
\ x n n ist eine Hexadezimalzahl, die aus zwei Ziffern besteht. Entspricht dem Zeichen mit dem Hexadezimalcode n . Zum Beispiel ist / \ x31 / äquivalent zu / 1 /.
\ x { n } n ist eine Hexadezimalzahl, die aus vier Ziffern besteht. Entspricht dem Unicode-Zeichen mit einem hexadezimalen Code n . Zum Beispiel ist / \ x {2663} / äquivalent zu / ♣ /.

6.4.2. Modifikatoren

Unterschiedliche Operationen mit regulären Ausdrücken verwenden verschiedene Modifikatoren, um den ausgeführten Vorgang zu verfeinern. Die vier Modifikatoren haben jedoch einen allgemeinen Zweck.

ich
Ignoriere Groß- und Kleinschreibung bei der Mustererkennung. Bei der Verwendung der Gebietsschema- Direktive für die Verwendung wird die Umwandlung von Zeichen in ein Register entsprechend der nationalen Einstellung vorgenommen.
m
Behandelt die Quellzeile als Puffer aus mehreren Textzeilen, die durch Zeilenumbrüche getrennt sind. Dies bedeutet, dass die Metazeichen ^ und $ nicht nur dem Anfang und dem Ende der gesamten Zeile entsprechen, sondern auch dem Anfang und dem Ende einer durch Zeilenumbrüche begrenzten Textzeile.
s
Betrachtet die Quellzeile als einzelne Textzeile und ignoriert Zeilenumbrüche. Dies bedeutet den Metazeichen . passt zu jedem Zeichen, einschließlich Zeilenumbrüchen.
x
Erlaubt die Verwendung von Leerzeichen und Kommentaren. Leerzeichen, die kein vorangestelltes \ -Zeichen haben und nicht in [] eingeschlossen sind, werden ignoriert. Das Zeichen # startet einen Kommentar, der ebenfalls ignoriert wird.

6.4.3. Unicode- und POSIX-Zeichenklassen

Wir können Syntax in regulären Ausdrücken verwenden

  [: Klasse:] 

Dabei gibt class den Namen der POSIX-Zeichenklasse an, d. h. den mobilen Standard für die Sprache C. Bei Verwendung der Anweisung utf8 anstelle der POSIX-Klassen können Sie die Unicode-Zeichenklassen im Konstrukt verwenden

  \ p {Klasse} 

Die folgende Tabelle fasst alle POSIX-Zeichenklassen, die entsprechenden Unicode-Zeichenklassen und gegebenenfalls die Metazeichen zusammen.

Tabelle 6.10. Zeichenklassen
Posix Unicode Metazeichen Beschreibung
Alpha IsAlpha Briefe
Alnum IsAlnum Buchstaben und Zahlen
Ascii Isascii ASCII-Zeichen
Strg IsCntrl Steuerzeichen
Ziffer IsDigit \ d Zahlen
Grafik Isgraph Buchstaben, Zahlen und Satzzeichen
niedriger IsLower Kleinbuchstaben
drucken Isprint Buchstaben, Zahlen, Interpunktion und Leerzeichen
punct IsPunct Interpunktionszeichen
Raum Isspace \ s Leerzeichen
oben Isupper Großbuchstaben
Wort Isward \ w Buchstaben, Zahlen und Unterstriche
xdigit IsXdigit Hexadezimale Zahlen

Zum Beispiel kann eine Dezimalzahl auf eine der folgenden drei Arten angegeben werden:

  / \ d + /
 / [: Ziffer:] + /
 / \ p {IsDigit} + / # benutze utf8 

Um anzuzeigen, dass ein Zeichen nicht zu einer bestimmten Klasse gehört, werden Konstrukte verwendet.

  [: ^ Klasse:]
 \ P {Klasse}

Zum Beispiel haben die folgenden Ausdrücke die gleiche Bedeutung:

  [: ^ Ziffer:] \ D \ P {IsDigit}
 [: ^ Leerzeichen:] \ S \ P {IsSpace}
 [: ^ Wort:] \ W \ P {IsWord} 

6.4.4. Speichern von Teilstrings

Die Verwendung von Klammern in einem regulären Ausdruck führt dazu, dass der Teilstring, der dem Muster in Klammern entspricht, in einem speziellen Puffer gespeichert wird. Um auf den n-ten gespeicherten Teilstring innerhalb eines regulären Ausdrucks zuzugreifen, wird das Konstrukt \ n verwendet und außerhalb davon $ n , wobei n beliebige Werte annehmen kann, beginnend mit 1. Beachten Sie jedoch, dass PERL die Ausdrücke \ 10 , \ 11 und t verwendet als Synonyme für oktale Zeichencodes \ 010 , \ 011 usw. Die Mehrdeutigkeit wird hier wie folgt aufgelöst. Das Symbol \ 10 wird als Verweis auf die 10. gespeicherte Teilzeichenfolge betrachtet, wenn es mindestens zehn linke Klammern im regulären Ausdruck davor hat; andernfalls ist es ein Zeichen mit einem oktalen Code 10. Metazeichen \ 1 , ... \ 9 werden immer als Referenzen auf gespeicherte Teilstrings betrachtet. Beispiele:

  if (/(.)\1/) {# sucht nach dem ersten sich wiederholenden Zeichen
  print "'$ 1' - das erste sich wiederholende Zeichen \ n";
 }
 if (/ Zeit: (..) :( ..) :( ..) /) {# Zeitkomponenten extrahieren
  $ Stunden = $ 1;
  $ Minuten = 2 $;
  $ Sekunden = $ 3;
 } 

Zusätzlich zu den Variablen $ 1 , $ 2 , ... gibt es einige spezielle Variablen, in denen die Ergebnisse der letzten Operation mit einem regulären Ausdruck gespeichert sind, nämlich:

Variable Beschreibung
$ & Die letzte gefundene Teilzeichenfolge.
$ ` Die Teilzeichenfolge vor der letzten gefundenen Teilzeichenfolge.
$ ' Die Teilzeichenfolge nach der letzten gefundenen Teilzeichenfolge.
$ + Die letzte gespeicherte Teilzeichenfolge.

Lassen Sie uns ein Beispiel geben:

  'AAA111BBB222' = ~ / (\ d +) /;
 print "$` \ n ";  # AAA
 Drucken Sie "$ & \ n";  # 111
 print "$ '\ n";  # BBB222
 drucke "$ + \ n";  # 111 

Alle diese speziellen Variablen behalten ihre Werte bis zum Ende des umschließenden Blocks oder bis das nächste erfolgreiche Muster übereinstimmt.

6.4.5. Erweiterte Proben

PERL enthält mehrere zusätzliche Konstruktionen, die in regulären Ausdrücken verwendet werden können, um ihre Funktionen zu erweitern. Alle diese Konstruktionen sind in Klammern eingeschlossen und beginnen mit dem Symbol ? das unterscheidet sie vom Erinnern an Teilstränge.

(? # Text )
Kommentar Die gesamte Konstruktion wird ignoriert.
(? Modifikatoren - Modifikatoren )
Aktiviert oder deaktiviert die angegebenen Modifikatoren . Modifikatoren, die vor dem - -Symbol stehen, sind eingeschaltet, solche nach dem Ausschalten. Beispiel:
  if (/ aaa /) {...} # case sensitive mapping
 if (/ (? i) aaa /) {...} # unterscheidet die Groß- und Kleinschreibung 
(?: Muster )
(? Modifikatoren - Modifikatoren : Muster )
Ermöglicht Ihnen, Unterausdrücke für reguläre Ausdrücke zu gruppieren, ohne die gefundene Übereinstimmung zu speichern. Die zweite Form aktiviert oder deaktiviert zusätzlich die angegebenen Modifikatoren . Zum Beispiel ist der Ausdruck /ко(?:т|шка)/ eine kurze Aufzeichnung des Ausdrucks /кот|кошка/ .
(? = Muster )
Matching mit Blick nach vorne ohne das gefundene Spiel auswendig zu lernen. Zum Beispiel entspricht der Ausdruck /Windows (?=95|98|NT|2000)/ "Windows" in der Zeichenfolge "Windows 98", stimmt aber in der Zeichenfolge "Windows 3.1" nicht überein. Nach dem Abgleich wird die Suche von der Position fortgesetzt, die der gefundenen Übereinstimmung folgt, ohne nach vorne zu schauen.
(?! Muster )
Missverständnis mit Blick nach vorne, ohne das gefundene Spiel auswendig zu lernen. Beispielsweise entspricht der Ausdruck /Windows (?!95|98|NT|2000)/ "Windows" in der Zeichenfolge "Windows 3.1", stimmt jedoch nicht mit der Zeichenfolge "Windows 98" überein. Nach dem Abgleich wird die Suche von der Position fortgesetzt, die der gefundenen Übereinstimmung folgt, ohne nach vorne zu schauen.
(? <= Muster )
Matching mit Blick zurück, ohne das gefundene Spiel auswendig zu lernen. Zum Beispiel entspricht der Ausdruck /(?<=\t)\w+/ dem Wort, das dem Tab-Zeichen folgt, und das Tab-Zeichen ist nicht in $ & enthalten . Das dem Zurückschauen entsprechende Fragment sollte eine feste Breite haben.
(? <! Muster )
Die Diskrepanz mit dem Blick zurück, ohne das gefundene Match auswendig zu lernen. Beispielsweise entspricht der Ausdruck /(?<!\t)\w+/ einem Wort, vor dem kein Tabulatorzeichen vorhanden ist. Das dem Zurückschauen entsprechende Fragment sollte eine feste Breite haben.

6.4.6. Operationen für reguläre Ausdrücke

Bis jetzt haben wir reguläre Ausdrücke in // Zeichen eingeschlossen. Tatsächlich werden die Begrenzungszeichen eines regulären Ausdrucks durch die q-Operation bestimmt , die wir auf sie anwenden. In diesem Abschnitt werden alle PERL-Operationen mit regulären Ausdrücken detailliert beschrieben.

6.4.6.1. Mustererkennung

  Syntax : / Muster / Modifikatoren m / Muster / Modifikatoren
 

Diese Operation stimmt die angegebene Zeichenfolge mit dem Mustermuster ab und gibt wahr oder falsch zurück, abhängig vom übereinstimmenden Ergebnis. Die abgebildete Zeichenfolge wird durch den linken Operanden der Operation = ~ oder ! ~ Angegeben. Beispiel:

  $ MeineNummer = '12345';
 if ($ mynumber = ~ / ^ \ d + $ /) {# Wenn der String $ mynummer aus Dezimalziffern besteht, dann ...
  ...
 } 

Wenn die Zeichenfolge nicht angegeben ist, wird ein Vergleich mit dem Inhalt der speziellen Variablen $ _ durchgeführt . Insbesondere kann das vorherige Beispiel wie folgt umgeschrieben werden:

  $ _ = '12345';
 if (/ ^ \ d + $ /) {
  ...
 } 

Zusätzlich zum Standard können folgende Modifikatoren verwendet werden:

Modifikator Beschreibung
c Setzen Sie die Suchposition bei fehlgeschlagenem Abgleich nicht zurück (nur mit dem Modifikator g ).
g Global-Matching, d. H. Suche nach allen Vorkommen der Probe.
o Kompilieren Sie einen regulären Ausdruck nur einmal.

Wenn der reguläre Ausdruck in // eingeschlossen ist , ist das anfängliche m optional. Die Konstruktion mit dem Anfangsbuchstaben m erlaubt die Verwendung beliebiger Zeichen, die in q-Operationen als Begrenzer eines regulären Ausdrucks erlaubt sind. Nützliche Spezialfälle:

  • Wenn die Trennzeichen die Zeichen '' sind , wird die Musterzeichenfolge nicht interpoliert. In anderen Fällen tritt eine Interpolation des Beispiels auf und wenn er Variablen enthält, wird er bei jedem Vergleich kompiliert. Um dies zu vermeiden, verwenden Sie den Modifikator o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen in der Stichprobe unverändert bleiben).
  • Wenn die Trennzeichen Zeichen sind ? dann gilt die Single-Match-Regel .

Wenn Muster eine leere Zeichenfolge ist, wird stattdessen der letzte erfolgreich abgeglichene reguläre Ausdruck verwendet.

Wenn der Modifikator g nicht angegeben wird und das Ergebnis der Zuordnung der Liste zugewiesen wird, wird bei fehlgeschlagener Zuordnung eine leere Liste zurückgegeben. Das Ergebnis einer erfolgreichen Übereinstimmung hängt vom Vorhandensein von Klammern in der Stichprobe ab. Wenn nicht, wird die Liste zurückgegeben (1) . Andernfalls wird eine Liste mit den Werten der Variablen $ 1, $ 2 usw. zurückgegeben, dh eine Liste aller gespeicherten Teilzeichenfolgen. Folgendes Beispiel

  ($ w1, $ w2, $ rest) = ($ x = ~ / ^ (\ S +) \ s + (\ S +) \ s ** (. *) /); 

setzt das erste Wort der Zeichenkette $ x in die Variable $ w1 , das zweite Wort der Variablen $ w2 und den Rest der Zeichenkette in die Variable $ rest .

Der Modifizierer g enthält ein globales Mustervergleichsmuster, d. H. Eine Suche nach allen Übereinstimmungen in einer Zeichenkette. Sein Verhalten hängt vom Kontext ab. Wenn das Ergebnis der Übereinstimmung der Liste zugewiesen ist, wird eine Liste aller gespeicherten Teilzeichenfolgen zurückgegeben. Wenn das Beispiel keine Klammern enthält, wird eine Liste aller Übereinstimmungen mit dem Beispiel zurückgegeben, als wäre es vollständig in Klammern eingeschlossen. Folgendes Beispiel

  $ _ = "12:23:45";
 @result = / \ d + / g;
 foreach $ elem (@result) {
  drucke "$ elem \ n";
 } 

zeigt die Linien 12 , 23 und 45 an .

In einem skalaren Kontext sucht das Mapping mit dem Modifikator g jedes Mal nach der nächsten Übereinstimmung für das Sample und gibt abhängig vom Suchergebnis true oder false zurück. Die Position in der Zeichenfolge nach der letzten Übereinstimmung kann mit der Funktion pos () gelesen oder geändert werden. Eine fehlgeschlagene Suche setzt die Suchposition normalerweise auf Null zurück, aber wir können dies vermeiden, indem wir den Modifikator c hinzufügen. Durch das Ändern einer Zeichenfolge wird auch die Suchposition in dieser Zeichenfolge zurückgesetzt.

Zusätzliche Funktionen bietet das \ G- Metazeichen, das nur in Kombination mit dem Modifikator g sinnvoll ist. Dieses Metazeichen entspricht der aktuellen Suchposition in der Zeichenfolge. Die Verwendung der m / \ G ... / gc- Konstruktion ist insbesondere zum Schreiben von lexikalischen Analysatoren geeignet, die verschiedene Aktionen für die im analysierten Text gefundenen Lexeme ausführen. Folgendes Beispiel

  $ _ = 'Word1, Word2 und 12345.';
 SCHLEIFE:
  {
  print ("Nummer"), wiederhole LOOP wenn / \ G d + c b;, ;;? s / / gc;
  print ("word"), wiederhole LOOP if / \ GrAAZa-z0-9 + \ br;.
  Drucken ("unbekannt"), Wiederholen LOOP wenn / \ G [^ A-Za-z0-9] + / gc;
  } 

zeigt die Wortnummer des Stringworts an.

6.4.6.2. Der einzige Mustervergleich

  Syntax :?  Muster ?
  m?  Muster ? 

Dieser Aufbau ist dem m / pattern / construction völlig ähnlich, mit dem einzigen Unterschied, dass ein erfolgreicher Musterabgleich nur einmal zwischen den Aufrufen der reset () Funktion durchgeführt wird. Dies ist beispielsweise dann praktisch, wenn nur das erste Vorkommen des Beispiels in jeder Datei in dem angezeigten Satz gesucht werden muss, z.

  while (<>) {
  if (? ^ $?) {
  ... # verarbeite die erste leere Zeile der Datei
  }
 } weiter {
  zurücksetzen, wenn eof;  # Reset-Status?  für die nächste Datei
 } 

6.4.6.3. Erstellen eines regulären Ausdrucks

  Syntax : qr / string / Modifikatoren
 

Dieses Konstrukt erstellt einen regulären Ausdruck mit String- Text und Modifikatoren und kompiliert es. Wenn die Trennzeichen Zeichen sind, wird die Interpolation der Zeichenfolge nicht ausgeführt. In anderen Fällen tritt eine Interpolation des Beispiels auf und wenn er Variablen enthält, wird er bei jedem Vergleich kompiliert. Um dies zu vermeiden, verwenden Sie den Modifikator o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen in der Stichprobe unverändert bleiben).

Sobald ein regulärer Ausdruck erstellt wurde, kann er sowohl unabhängig als auch als Fragment anderer regulärer Ausdrücke verwendet werden. Beispiele:

  $ re = qr / \ d + /;
 $ string = ~ / \ s * $ {re} \ s * /;  # Aufnahme in einen anderen regulären Ausdruck
 $ string = ~ $ re;  # unabhängige Verwendung
 $ string = ~ / $ re /;  # das selbe

 $ re = qr / $ header / ist;
 s / $ re / text /;  # wie s / $ header / text / ist 

6.4.6.4. Substitution

  Syntax : s / Muster / Zeichenfolge / Modifikatoren
 

Diese Operation stimmt die angegebene Zeichenfolge mit dem Mustermuster ab und ersetzt die gefundenen Fragmente durch die Zeichenfolge . Sie gibt die Anzahl der erfolgten Ersetzungen oder false (genauer gesagt eine leere Zeichenfolge) zurück, wenn die Übereinstimmung fehlgeschlagen ist. Die abgebildete Zeichenfolge wird vom linken Operanden der Operation = ~ oder ! ~ Angegeben . Es muss eine skalare Variable, ein Element eines Arrays oder ein Element eines assoziativen Arrays sein, zum Beispiel:

  $ path = '/ usr / bin / perl';
 $ pfad = ~ s | / usr / bin | / usr / lokal / bin |; 

Wenn die Zeichenfolge nicht angegeben wird, wird eine Ersetzungsoperation für die spezielle Variable $ _ ausgeführt . Insbesondere kann das vorherige Beispiel wie folgt umgeschrieben werden:

  $ _ = '/ usr / bin / perl';
 s | / usr / bin | / usr / lokal / bin |; 

Zusätzlich zum Standard können folgende Modifikatoren verwendet werden:

Modifikator Beschreibung
e Behandle Zeichenfolge als PERL-Ausdruck.
g Globale Ersetzung, d. H. Ersetzen aller Vorkommen der Probe.
o Kompilieren Sie einen regulären Ausdruck nur einmal.

Wir können stattdessen // jedes Zeichen verwenden, das in q-Operationen erlaubt ist. Wenn das Muster in Klammern eingeschlossen ist, muss die Zeichenfolge ein eigenes Paar von Terminatoren haben, z. B. s(foo)[bar] oder s<foo>/bar/ .

Wenn die Trennzeichen die Zeichen '' sind , wird die Musterzeichenfolge nicht interpoliert. In anderen Fällen tritt eine Interpolation des Beispiels auf und wenn er Variablen enthält, wird er bei jedem Vergleich kompiliert. Um dies zu vermeiden, verwenden Sie den Modifikator o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen in der Stichprobe unverändert bleiben).

Wenn Muster eine leere Zeichenfolge ist, wird stattdessen der letzte erfolgreich abgeglichene reguläre Ausdruck verwendet.

Standardmäßig wird nur das erste gefundene Muster ersetzt. Um alle Vorkommen eines Beispiels in einer Zeichenfolge zu ersetzen, müssen Sie den Modifikator g verwenden .

Der e- Modifikator gibt an, dass die Zeichenfolge ein Ausdruck ist. In diesem Fall wird die Funktion eval () zuerst auf die Zeichenfolge angewendet, und dann wird die Ersetzung durchgeführt. Beispiel:

  $ _ = '123';
 s / \ d + / $ & * 2 / e;  # $ _ = '246'
 s / \ d / $ & * 2 / zB;  # das selbe 

Lassen Sie uns einige typische Beispiele für die Verwendung der Substitutionsoperation angeben. Entfernen von Kommentaren wie / * ... * / aus Java oder C Programmtext:

  $ programm = ~ s {
  / \ * # Kommentar beginnen
  . *?  # Minimale Anzahl von Zeichen
  \ * / # Ende des Kommentars
 } [] gsx; 

Entfernen Sie die Start- und End-Leerzeichen in der $ var- Zeile:

  für ($ var) {
  s / ^ \ s + //;
  s / \ s + $ //;
 } 

Ordne die ersten beiden Felder in $ _ neu an . Beachten Sie, dass die Ersetzungszeichenfolge die Variablen $ 1 und $ 2 und nicht die \ 1 und \ 2 Metazeichen verwendet:

  s / ([^] *) * ([^] *) / $ 2 $ 1 /; 

Ersetzen von Registerkarten durch Leerzeichen mit Ausrichtung in Spalten, die ein Vielfaches von acht sind:

  1 während s / \ t + / '' x (Länge ($ &) * 8 - Länge ($ `)% 8) / e; 

6.4.6.5. Transliteration

  Syntax : tr / list1 / list2 / Modifizierer y / list1 / list2 / Modifikatoren
 

Transliteration besteht darin, alle Zeichen aus der Liste1 durch die entsprechenden Zeichen aus der Liste2 zu ersetzen . Er gibt die Anzahl der ersetzten oder gelöschten Zeichen zurück. Listen müssen aus einzelnen Zeichen und / oder Bereichen der Form az bestehen . Die zu konvertierende Zeichenfolge wird durch den linken Operanden der Operation = ~ oder ! ~ Angegeben . Es muss eine skalare Variable, ein Element eines Arrays oder ein Element eines assoziativen Arrays sein, zum Beispiel:

  $ test = 'ABCDEabcde';
 $ test = ~ tr / AZ / az /;  # Ersetzen von Kleinbuchstaben in Großbuchstaben 

Wenn die Zeichenfolge nicht angegeben wird, wird eine Ersetzungsoperation für die spezielle Variable $ _ ausgeführt . Insbesondere kann das vorherige Beispiel wie folgt umgeschrieben werden:

  $ _ = 'ABCDEabcde';
 tr / AZ / az /; 

Wir können stattdessen // jedes Zeichen verwenden, das in q-Operationen erlaubt ist. Wenn list1 in Klammern steht, muss list2 ein eigenes Paar von Terminatoren haben, z. B. tr(AZ)[az] oder tr<AZ>/az/ .

Diese Operation wird normalerweise tr genannt . Das Synonym y wird für Fanatiker von sed eingeführt und wird nur von ihnen benutzt. Transliteration unterstützt die folgenden Modifikatoren:

Modifikator Beschreibung
c Ersetzen Sie Zeichen, die nicht in Liste1 enthalten sind .
d Löschen Sie Zeichen, für die kein Ersatz vorhanden ist.
s Entfernen Sie doppelte Zeichen beim Ersetzen.
U In / aus UTF-8-Codierung konvertieren.
C In / aus Einzelbyte-Kodierung konvertieren.

Der Modifikator c bewirkt die Transliteration aller Zeichen, die nicht in der Liste list1 enthalten sind . Zum Beispiel ersetzt die Operation tr/a-zA-Z/ /c alle Zeichen, die keine lateinischen Buchstaben sind, durch Leerzeichen.

Wenn list2 kürzer als list1 ist , wird es standardmäßig mit dem letzten Zeichen aufgefüllt, und wenn es leer ist, wird es als list1 interpretiert (dies ist praktisch, um die Anzahl der Zeichen einer bestimmten Klasse in einer Zeile zu zählen). Der Modifikator d ändert diese Regeln: Alle Zeichen aus Liste1 , die keine Übereinstimmung in Liste2 aufweisen, werden aus der Zeichenfolge entfernt. Zum Beispiel wird die Operation tr/a-zA-Z//cd alle Zeichen, die keine lateinischen Buchstaben sind, aus der Zeichenkette entfernen.

Der Modifizierer s entfernt Duplikate: Wenn mehrere Zeichen durch ein und dasselbe Zeichen in einer Zeile ersetzt werden, bleibt nur eine Instanz dieses Zeichens übrig. Zum Beispiel entfernt die Operation tr/ / /s doppelte Leerzeichen in einer Zeichenfolge.

C- und U- Modifikatoren werden verwendet, um Zeichen aus der Systemcodierung in UTF-8 und zurück zu übersetzen. Der erste von ihnen zeigt die ursprüngliche Codierung, und der zweite - die Codierung des Ergebnisses. Beispiel: tr/\0-\xFF//CU rekodiert eine Zeichenfolge aus der Systemcodierung in UTF-8, und tr/\0-\xFF//UC führt die inverse Transcodierung durch.

Die Transliteration wird ohne die Interpolation von Zeichenlisten ausgeführt. Um Variablen darin zu verwenden, müssen Sie die Funktion eval () aufrufen, z.

  eval "tr / $ oldlist / $ newlist /";