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

Spickzettel für reguläre Ausdrücke PERL

Nach Thema:


Kapitel 6.4. Reguläre Ausdrücke

6.4.1. Reguläre Ausdruckssyntax

Reguläre Ausdrücke sind Muster, um bestimmte Kombinationen von Zeichen in Textzeichenfolgen zu finden und durch andere Symbolkombinationen zu ersetzen (diese Operationen werden jeweils als Mustererkennung und -ersetzung bezeichnet ). Der reguläre Ausdruck in PERL sieht so aus

  / Muster / Modifikatoren 

Here Muster ist 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 wird die angegebene Kombination von Zeichen in der Zeichenfolge übereinstimmen. Zum Beispiel entspricht der Ausdruck / cat / den ausgewählten Teilstrings in den folgenden Zeilen: " cat ok", "pro cat ", " cut ". Die wahre Stärke von regulären PERL-Ausdrücken macht es jedoch möglich, spezielle Metazeichen in ihnen zu verwenden.

Tabelle 6.9. Metazeichen in regulären Ausdrücken
Symbol Beschreibung
\ Bei Zeichen, die normalerweise wörtlich behandelt werden, bedeutet dies, dass das nächste Zeichen ein Metazeichen ist. Beispielsweise entspricht / n / dem Buchstaben n und / \ n / dem Zeilenvorschubzeichen.
Bei Metazeichen muss ein Symbol wörtlich verstanden werden. Zum Beispiel bezeichnet / ^ / den Anfang der Zeile und / \ ^ / entspricht einfach dem Zeichen ^. / \\ / entspricht dem umgekehrten Schrägstrich \.
^ Entspricht dem Anfang der Zeile (vergleiche Modifikator m ).
$ Entspricht dem Ende der Zeile (vergleiche Modifikator m ).
. Entspricht einem beliebigen Zeichen außer einem Zeilenumbruch (vergleiche Modifizierer s ).
* Entspricht dem Wiederholen des vorherigen Zeichens Null oder mehrmals.
+ Entspricht der Wiederholung des vorherigen Zeichens ein oder mehrere Male.
? Entspricht der Wiederholung des vorherigen Zeichens null oder einmal.
( Muster ) Entspricht der Musterzeile und merkt sich die gefundene Übereinstimmung .
x | y Entspricht x oder y .
{ n } n ist eine nichtnegative Zahl. Entspricht genau n Vorkommen des vorherigen Zeichens.
{ n ,} n ist eine nichtnegative Zahl. Entspricht n oder mehr Vorkommen des vorherigen Zeichens. / x {1,} / entspricht / x + /. / x {0,} / entspricht / x * /.
{ n , m } n und m sind nichtnegative Zahlen. Entspricht mindestens n und nicht mehr als m Vorkommen des vorherigen Zeichens. / x {0,1} / entspricht / x? /.
[ xyz ] Entspricht einem beliebigen Zeichen aus den eckigen Klammern.
[^ xyz ] Entspricht einem beliebigen Zeichen außer den in eckigen Klammern eingeschlossenen Zeichen.
[ a - z ] Entspricht einem beliebigen Zeichen im angegebenen Bereich.
[^ a - z ] Entspricht einem anderen Zeichen als dem angegebenen Bereich.
\ a Entspricht dem Glockensymbol (BEL).
\ A Findet nur den Anfang der Zeile, selbst mit dem Modifikator m .
\ b Sie entspricht der Wortgrenze, d. H. Der Position zwischen \ w und \ W in beliebiger Reihenfolge.
\ B Entspricht einer anderen Position als der Wortgrenze.
\ von X Entspricht dem Zeichen Strg + X. Zum Beispiel ist / \ cI / äquivalent zu / \ t /.
\ C Es entspricht einem Byte, sogar mit der Verwendung der utf8- Direktive.
\ d Entspricht der Figur. Es entspricht [0-9].
\ D Entspricht einem nicht numerischen Zeichen. Es entspricht [^ 0-9].
\ e Entspricht dem Escapezeichen (ESC).
\ E Das Ende der Transformationen \ L , \ Q , \ U.
\ f Stimmt mit dem Formatübersetzungszeichen (FF) überein.
\ 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 der Eigenschaft property . Wenn die Eigenschaft aus mehreren Zeichen besteht, verwenden Sie die Syntax \ p { property } .
\ P Eigenschaft Entspricht Unicode-Zeichen, die nicht über die Eigenschaft property verfügen. Wenn die Eigenschaft aus mehreren Zeichen besteht, verwenden Sie die Syntax \ P { property } .
\ Q Fügt das Zeichen "\" vor den Metazeichen zu \ E. hinzu
\ r Entspricht einem Wagenrücklaufzeichen (CR).
\ s Entspricht dem Leerzeichen. Entspricht / [\ f \ n \ r \ t] /.
\ S Entspricht einem beliebigen Nicht-Leerzeichen-Zeichen. Entspricht / [^ \ f \ n \ r \ t] /.
\ t Entspricht dem Tabulatorzeichen (HT).
\ u Konvertiert das nächste Zeichen in Großbuchstaben.
\ U Konvertiert Zeichen in Großbuchstaben nach \ E.
\ w Entspricht dem lateinischen Buchstaben, der Zahl oder dem Unterstrich. Äquivalent zu / [A-Za-z0-9_] /.
\ W Entspricht einem beliebigen Zeichen außer einem Buchstaben, einer Zahl oder einem Unterstrich. Entspricht / [^ A-Za-z0-9_] /.
\ X Entspricht einer Folge von Unicode-Zeichen aus dem Hauptzeichen und einem Satz diakritischer Symbole. Entspricht dem Ausdruck / C <(?: \ PM \ pM *)> /.
\ z Trifft nur das Ende der Zeile, auch mit dem Modifikator m .
\ Z Entspricht nur dem Ende der Zeile oder dem Zeilenumbruch am Ende der Zeile, auch mit dem Modifikator m .
\ 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. Sie entspricht dem Zeichen mit dem Oktalcode n . Zum Beispiel ist / \ 011 / äquivalent zu / \ t /.
\ x n n ist eine Hexadezimalzahl, die aus zwei Ziffern besteht. Entspricht einem Zeichen mit Hexadezimalcode n . Zum Beispiel ist / \ x31 / äquivalent zu / 1 /.
\ x { n } n ist eine Hexadezimalzahl, die aus vier Ziffern besteht. Entspricht einem Unicode-Zeichen mit hexadezimalem n . Zum Beispiel ist / \ x {2663} / äquivalent zu / ♣ /.

6.4.2. Modifikatoren

Verschiedene Operationen mit regulären Ausdrücken verwenden verschiedene Modifikatoren, um die auszuführende Operation anzugeben. Die vier Modifikatoren haben jedoch einen allgemeinen Zweck.

ich
Ignoriert den Fall von Zeichen, wenn sie mit einem Muster übereinstimmen. Bei der Verwendung der Gebietsschema- Direktive für die Verwendung wird die Umwandlung von Zeichen in ein Register unter Berücksichtigung der nationalen Einstellung vorgenommen.
m
Betrachtet die Quellzeichenfolge 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 Zeichenfolge entsprechen, sondern auch dem Anfang und dem Ende der durch Zeilenumbrüche begrenzten Textzeile.
s
Betrachtet die Quellzeichenfolge als einzelne Textzeile und ignoriert Zeilenumbrüche. Dies bedeutet, dass das Metazeichen . passt auf ein beliebiges Zeichen, einschließlich eines Zeilenumbruchs.
x
Erlaubt die Verwendung von Leerzeichen und Kommentaren. Leerzeichen, die kein vorangestelltes Zeichen haben und nicht in [] eingeschlossen sind, werden ignoriert. Das Symbol # startet einen Kommentar, der ebenfalls ignoriert wird.

6.4.3. Unicode- und POSIX-Zeichenklassen

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

  [: Klasse:] 

Dabei gibt class den Namen der POSIX-Symbolklasse an, also den mobilen Standard für die Sprache C. Wenn Sie die Anweisung utf8 anstelle der POSIX-Klasse verwenden, können Sie die Unicode-Zeichenklassen im Konstrukt verwenden

  \ p {Klasse} 

Die folgende Tabelle fasst alle POSIX-Zeichenklassen, die entsprechenden Unicode-Zeichenklassen und ggf. 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 Interpunktion
niedriger IsLower Kleinbuchstaben
drucken IsPrint Buchstaben, Zahlen, Interpunktion und Leerzeichen
punct IsPunct Interpunktion
Raum Isspace \ s Abstandssymbole
oben IsUpper Großbuchstaben
Wort Iswort \ w Buchstaben, Zahlen und Unterstriche
xdigit IsXDigit Hexadezimale Ziffern

Beispielsweise können Sie eine Dezimalzahl auf eine der folgenden drei Arten angeben:

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

Um anzuzeigen, dass das Symbol nicht zu einer bestimmten Klasse gehört, werden Konstruktionen 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. Teilstrings speichern

Die Verwendung von Klammern in einem regulären Ausdruck bewirkt, dass die dem Muster in Klammern entsprechende Teilzeichenfolge in einem speziellen Puffer gespeichert wird. Um auf die n-te gespeicherte Teilzeichenfolge innerhalb des regulären Ausdrucks zuzugreifen, verwenden Sie das Konstrukt \ n und außerhalb davon $ n , wobei n Werte ab 1 annehmen kann. Denken Sie jedoch daran, dass PERL die Ausdrücke \ 10 , \ 11 und t verwendet usw. als Synonyme für die oktalen Codes der Zeichen \ 010 , \ 011 , usw. Die Mehrdeutigkeit wird hier wie folgt aufgelöst. Das Zeichen \ 10 wird als Verweis auf die 10. gespeicherte Teilzeichenfolge betrachtet, wenn im regulären Ausdruck mindestens zehn Klammern davor stehen; ansonsten ist es ein Zeichen mit Oktalcode 10. Metazeichen \ 1 , ... \ 9 werden immer als Referenzen auf gespeicherte Teilzeichenfolgen betrachtet. Beispiele:

  if (/(.)\1/) {# suche das erste sich wiederholende Zeichen
  print "'$ 1' ist das erste sich wiederholende Zeichen \ n";
 }
 if (/ Zeit: (..) :( ..) :( ..) /) {# extrahiere die Zeitkomponenten
  $ 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 dem regulären Ausdruck gespeichert sind, nämlich:

Variable Beschreibung
$ & Zuletzt gefundene Teilzeichenfolge.
$ ` Teilstring vor dem letzten gefundenen Teilstring.
$ ' 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 zur nächsten erfolgreichen Übereinstimmung mit dem Muster bei.

6.4.5. Erweiterte Beispiele

PERL enthält mehrere zusätzliche Konstrukte, die in regulären Ausdrücken verwendet werden können, um ihre Funktionen zu erweitern. Alle diese Konstrukte sind in Klammern eingeschlossen und beginnen mit einem Symbol ? , die sie vom Merken von Teilsträngen unterscheidet.

(? # Text )
Kommentar. Die gesamte Konstruktion wird ignoriert.
(? Modifikatoren - Modifikatoren )
Aktiviert oder deaktiviert die angegebenen Modifikatoren . Modifikatoren, die vor dem Symbol stehen, sind enthalten, stehen danach - sind ausgeschaltet. Beispiel:
  if (/ aaa /) {...} # unterscheidet zwischen Groß- und Kleinschreibung
 if (/ (i) aaa /) {...} # Groß- / Kleinschreibung nicht beachten 
(?: Muster )
(? Modifikatoren - Modifikatoren : Muster )
Ermöglicht das Gruppieren von Teilausdrücken eines regulären Ausdrucks, ohne sich an die gefundene Übereinstimmung zu erinnern. Die zweite Form schaltet zusätzlich die angegebenen Modifikatoren ein oder aus. Zum Beispiel ist der Ausdruck /ко(?:т|шка)/ ein kurzer Eintrag des Ausdrucks /кот|кошка/ .
(? = Muster )
Matching mit Blick nach vorne, ohne das gefundene Match auswendig zu lernen. Beispielsweise entspricht der Ausdruck /Windows (?=95|98|NT|2000)/ "Windows" in der Zeile "Windows 98", stimmt aber nicht mit der Zeile "Windows 3.1" überein. Nach dem Matching wird die Suche von der Position aus fortgesetzt, die dem gefundenen Match folgt, ohne das Vorwärts-Look zu berücksichtigen.
(?! Muster )
Mismatch mit Blick nach vorne, ohne sich an das gefundene Match zu erinnern. 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 Matching wird die Suche von der Position aus fortgesetzt, die dem gefundenen Match folgt, ohne das Vorwärts-Look zu berücksichtigen.
(? <= Muster )
Matching mit einem Blick zurück, ohne das gefundene Match auswendig zu lernen. Zum Beispiel entspricht der Ausdruck /(?<=\t)\w+/ dem Wort, das auf das Tab-Zeichen folgt, und das Tab-Zeichen ist nicht in $ & enthalten . Ein Fragment, das dem Zurückschauen entspricht, sollte eine feste Breite haben.
(? <! Muster )
Inkonsistenz mit dem Blick zurück, ohne sich an das gefundene Match zu erinnern. Zum Beispiel entspricht der Ausdruck /(?<!\t)\w+/ einem Wort, vor dem es kein Tab-Zeichen gibt. Ein Fragment, das dem Zurückschauen entspricht, sollte eine feste Breite haben.

6.4.6. Operationen mit regulären Ausdrücken

Bis jetzt haben wir reguläre Ausdrücke in die Symbole eingeschlossen. Tatsächlich werden Symbole für reguläre Ausdrücke durch die q-Operation definiert , die wir auf sie anwenden. In diesem Abschnitt werden alle Operationen von PERL mit regulären Ausdrücken detailliert beschrieben.

6.4.6.1. Vergleich mit der Probe

  Syntax : / Muster / Modifikatoren m / Muster / Modifikatoren
 

Diese Operation ordnet die angegebene Zeichenfolge dem Mustermuster zu und gibt abhängig vom Ergebnis der Zuordnung wahr oder falsch zurück. Die übereinstimmende 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 der Inhalt der speziellen Variablen $ _ verglichen. Insbesondere kann das vorherige Beispiel wie folgt umgeschrieben werden:

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

Zusätzlich zum Standard können hier die folgenden Modifikatoren verwendet werden:

Modifikator Beschreibung
c Setzen Sie die Suchposition nicht zurück, wenn die Übereinstimmung nicht erfolgreich ist (nur mit dem Modifikator g ).
g Globale Übereinstimmung, d. H. Suche nach allen Vorkommen eines Musters.
o Kompilieren Sie den 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 uns, als Zeichen des regulären Ausdrucks alle Zeichen zu verwenden, die in q-Operationen erlaubt sind. Nützliche Spezialfälle:

  • Wenn die Begrenzer '' sind , wird das Muster nicht interpoliert. In anderen Fällen interpoliert das Beispiel und wenn es Variablen enthält, führt jede Kompilierung seine Kompilierung durch. Um dies zu vermeiden, verwenden Sie den Modifizierer o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen, die in das Muster eingegeben werden, unverändert bleiben).
  • Wenn die Begrenzer Zeichen sind ?? , dann gilt die Single-Matching-Regel .

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

Wenn der Modifikator g nicht festgelegt ist und das Ergebnis der Zuordnung der Liste zugewiesen ist, wird bei fehlgeschlagener Zuordnung eine leere Liste zurückgegeben. Das Ergebnis einer erfolgreichen Übereinstimmung hängt vom Vorhandensein von Klammern im Muster ab. Wenn sie nicht vorhanden sind, wird die Liste (1) zurückgegeben. Andernfalls wird eine Liste zurückgegeben, die aus den Werten der Variablen $ 1, $ 2 usw. besteht, dh einer Liste aller gespeicherten Teilstrings. Das folgende Beispiel

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

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

Der Modifikator g ermöglicht eine globale Übereinstimmung mit dem Muster, dh die Suche nach allen Übereinstimmungen in der Zeichenfolge. Ihr Verhalten hängt vom Kontext ab. Wenn das Ergebnis der Zuordnung der Liste zugewiesen ist, wird eine Liste aller gespeicherten Teilzeichenfolgen zurückgegeben. Wenn das Beispiel keine Klammern enthält, wird die Liste aller Übereinstimmungen mit dem Beispiel zurückgegeben, als ob es vollständig in Klammern eingeschlossen wäre. Das folgende 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 die Übereinstimmung mit dem Modifikator g jedes Mal nach der nächsten Übereinstimmung mit dem Muster und gibt, abhängig vom Suchergebnis, wahr oder falsch zurück. Die Position in der Zeile nach der letzten Übereinstimmung kann mit der Funktion pos () gelesen oder geändert werden. Bei einer fehlgeschlagenen Suche wird die Suchposition normalerweise auf null zurückgesetzt. Dies können Sie jedoch vermeiden, indem Sie den Modifizierer c hinzufügen. Durch das Ändern der Zeile wird auch die Suchposition zurückgesetzt.

Zusätzliche Möglichkeiten bietet das \ G- Metazeichen, das nur in Verbindung mit dem Modifikator g sinnvoll ist. Dieses Metazeichen entspricht der aktuellen Suchposition in der Zeichenfolge. Die Verwendung der Konstruktion m / \ G ... / gc ist insbesondere zum Schreiben lexikalischer Analysatoren, die verschiedene Aktionen für die im analysierten Text angetroffenen Token durchführen, praktisch. Das folgende Beispiel

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

zeigt die Wortnummer des Stringworts an.

6.4.6.2. Der einzige Vergleich mit der Probe

  Syntax :?  Muster ?
  m?  Muster ? 

Diese Konstruktion ist vollständig analog zu dem m / pattern / -Konstrukt, mit dem einzigen Unterschied: Eine erfolgreiche Übereinstimmung mit dem Muster wird nur einmal zwischen Aufrufen der Funktion reset () durchgeführt . Dies ist beispielsweise dann praktisch, wenn nur das erste Auftreten eines Musters in jeder Datei aus dem betrachteten 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 Zeichenfolgetext und Modifikatoren und kompiliert es. Wenn die Begrenzer '' sind , wird die Interpolation der Zeichenfolge nicht durchgeführt. In anderen Fällen interpoliert das Beispiel und wenn es Variablen enthält, führt jede Kompilierung seine Kompilierung durch. Um dies zu vermeiden, verwenden Sie den Modifizierer o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen, die in das Muster eingegeben werden, unverändert bleiben).

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

  $ re = qr / \ d + /;
 $ string = ~ / \ s * $ {re} \ s * /;  # in einem anderen regulären Ausdruck enthalten
 $ 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 ordnet die angegebene Zeichenfolge dem Mustermuster zu und ersetzt die gefundenen Fragmente durch eine Zeichenfolge . Sie gibt die Anzahl der Ersetzungen, die vorgenommen wurden, oder false (genauer gesagt, eine leere Zeichenfolge) zurück, wenn die Übereinstimmung fehlschlägt. Die übereinstimmende Zeichenfolge wird durch den linken Operanden der Operation = ~ oder ! ~ Angegeben . Es muss eine skalare Variable, ein Array-Element 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 die 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 hier die folgenden Modifikatoren verwendet werden:

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

Wir können jedes Zeichen verwenden, das in Q-Operationen anstelle von // gültig ist. Wenn das Muster in Klammern eingeschlossen ist, muss string ein eigenes Trennzeichenpaar haben, z. B. s(foo)[bar] oder s<foo>/bar/ .

Wenn die Begrenzer '' sind , wird das Muster nicht interpoliert. In anderen Fällen interpoliert das Beispiel und wenn es Variablen enthält, führt jede Kompilierung seine Kompilierung durch. Um dies zu vermeiden, verwenden Sie den Modifizierer o (natürlich, wenn Sie sicher sind, dass die Werte der Variablen, die in das Muster eingegeben werden, 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 Sample ersetzt. Um alle Vorkommen eines Musters in einer Zeichenfolge zu ersetzen, müssen Sie den Modifikator g verwenden .

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

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

Hier sind einige typische Beispiele für die Verwendung einer Substitutionsoperation. Kommentare aus dem Formular / * ... * / aus dem Text eines Java- oder C-Programms entfernen:

  $ programm = ~ s {
  / \ * # Beginn des Kommentars
  . *?  # Die minimale Anzahl von Zeichen
  \ * / # Ende des Kommentars
 } [] gsx; 

Löschen Sie die führenden und nachgestellten Leerzeichen in der $ var- Zeile:

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

Permutation der ersten beiden Felder in $ _ . Beachten Sie, dass die Ersatzzeile die Variablen $ 1 und $ 2 und nicht die Metazeichen \ 1 und \ 2 verwendet :

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

Ersetzen Sie Registerkarten durch Leerzeichen mit Ausrichtung für 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 Liste list1 durch die entsprechenden Zeichen aus der list2- Liste zu ersetzen . Es 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 Array-Element oder ein Element eines assoziativen Arrays sein, zum Beispiel:

  $ test = 'ABCDEabcde';
 $ test = ~ tr / AZ / az /;  # Kleinbuchstaben durch Großbuchstaben ersetzen 

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

  $ _ = 'ABCDEabcde';
 tr (AZ) az); 

Wir können jedes Zeichen verwenden, das in Q-Operationen anstelle von // gültig ist. Wenn list1 in Klammern eingeschlossen ist, muss list2 ein eigenes Trennzeichenpaar haben, z. B. tr(AZ)[az] oder tr<AZ>/az/ .

Normalerweise wird diese Operation tr genannt . Das Synonym y wird für Fanatiker des Sed Editors eingeführt und wird nur von ihnen verwendet. 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 Löschen Sie doppelte Zeichen beim Ersetzen.
U Konvertieren in / aus der UTF-8-Codierung.
C In / aus einer Einzelbyte-Codierung konvertieren.

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

Wenn list2 kürzer als list1 ist , wird es standardmäßig mit dem letzten Zeichen aktualisiert , und wenn es leer ist, wird angenommen, dass es list1 entspricht (dies ist praktisch, um die Anzahl der Zeichen einer bestimmten Klasse in einer Zeichenfolge zu zählen). Modifier d ändert diese Regeln: Alle Zeichen aus list1 , die in list2 nicht übereinstimmen, werden aus der Zeichenkette entfernt. Zum Beispiel wird die Operation tr/a-zA-Z//cd alle Zeichen, die keine lateinischen Buchstaben sind, aus der Zeichenkette entfernen.

Der Modifikator s entfernt Duplikate: Werden mehrere Zeichen nacheinander durch das gleiche Zeichen ersetzt, bleibt nur eine Instanz dieses Symbols übrig. Zum Beispiel entfernt die Operation tr/ / /s wiederholte Leerzeichen in der Zeichenfolge.

Die Modifikatoren C und U sind für die Zeichenumwandlung von der Systemcodierung zu UTF-8 und umgekehrt ausgelegt. Der erste zeigt auf die ursprüngliche Codierung und der zweite auf die Codierung des Ergebnisses. Beispielsweise wird tr/\0-\xFF//CU die Zeichenfolge von der Systemcodierung in UTF-8 umcodieren, und tr/\0-\xFF//UC führt die umgekehrte Transkodierung durch.

Die Transliteration erfolgt ohne Interpolation von Symbollisten. Um die darin enthaltenen Variablen zu verwenden, müssen Sie die Funktion eval () aufrufen, zum Beispiel:

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