RegExp-Kurs 03: egrep

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

RegExp-Kurs 03: egrep

Beitrag von Meillo » 22.04.2022 12:21:34

Kursuebersicht


Teil 03: egrep

Nun geht es an die Praxis. Wir verwenden hierfuer nun egrep, das auf POSIX Extended Regular Expressions (EREs) basiert.

Das Escapezeichen ist bei allen ueblichen RE-Varianten der Backslash (\).

Was die Literale und Metazeichen angeht, ist es leider nicht so schoen klar wie wir es in der vorigen Einheit betrachtet haben. Dort waren jeweils die unescapeten Zeichen Literale und die escapeten Zeichen Metazeichen, bzw. umgekehrt. In der Praxis sind diese zwei Zeichenarten nicht so klar getrennt, sondern vermischt. Es ist weiterhin so, dass das Escapen die Zeichenart aendert, aber sowohl unescapete Zeichen als auch escapete Zeichen koennen sowohl Literale als auch Metazeichen sein. Das macht die Sache etwas schwieriger. Bei den unescapeten Zeichen sind also manche Literale und manche Metazeichen; welche was sind muss man auswendig lernen. Immerhin sind bei EREs alle escapeten Zeichen Literale. (Das ist bei BREs nicht so.) Allerdings kann man auch wiederum nicht einfach ein beliebiges Zeichen escapen, um es zu einem Literal zu machen. Escapet man beispielsweise einen Buchstaben, so ist das Verhalten undefiniert. Und da POSIX nur eine nachtraegliche Zusammenfassung des groessten gemeinsamen Nenners der vielfaeltigen Unix-Realitaet ist, verhalten sich die konkreten Programme oft nochmal ein bisschen anders als es in POSIX beschrieben ist.

Konkret heisst das, dass man fuer jede RE-Variante und letztlich fuer jedes Programm separat auswendig lernen muss, welche Zeichen Sonderbedeutungen haben!

Das ist wohl die groesste Schwierigkeit bei der Verwendung von REs. Wir gehen vorerst von EREs aus (z.B. in egrep, awk), die in der Hinsicht etwas einfacher sind als BREs (z.B. in grep, sed).


In EREs steht jedes Zeichen fuer sich selbst, ausser es ist ein Zeichen mit Sonderbedeutung. Die Zeichen mit Sonderbedeutung sind:

Code: Alles auswählen

\.[]()*+?{}|^$
... wobei sie leider auch nicht an jeder Stelle in einem Ausdruck eine Sonderbedeutung haben. Und Zeichen wie - und , haben nur an bestimmten Stellen eines Ausdrucks eine Sonderbedeutung. Dies ist nunmal so und ich kann es euch leider nicht einfacher machen. :-(

Kurzum koennen wir uns aber merken, dass alle Buchstaben, Zahlen und z.B. Unterstrich, Apostroph und Anfuehrungszeichen immer literal fuer sich selbst stehen.

Obige Sonderzeichen sind an den meisten Stellen Metazeichen. Wenn wir sie escapen, werden sie literal interpraetiert.


Aufgaben:

1) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Reiter'' matcht. Teste ihn entweder so:

Code: Alles auswählen

echo "Reiter" | egrep 'DEIN_AUSDRUCK'
Wenn das Wort ``Reiter'' ausgegeben wird, hat der Ausdruck gematcht. Oder wende den egrep-Befehl auf den Text schwaebische-kunde.txt (s.u.) an. Dort werden dann alle Zeilen ausgegeben, die ``Reiter'' enthalten. Wenn du `egrep -o' verwendest, dann werden nur die gematchten Worte selbst ausgegeben.

2) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Viel Steine'' matcht.

3) Schreibe einen egrep-Ausdruck der die Zeichenkette ``heil'gen'' matcht.

4) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Er sprach: "Sagt an,'' matcht.

5) Schreibe einen egrep-Ausdruck der die Zeichenkette ``eben.'' matcht. Testet mit `-o' und ohne.

6) Schreibe einen egrep-Ausdruck der die Zeichenkette ``?'' matcht.

7) Vergleiche diese egrep-Ausdruecke mit der Verwendung von fgrep, welches eine simple Stringsuche umsetzt. Bei fgrep werden alle Zeichen literal interpraetiert. Wo liegen die Unterschiede? (Bis zu diesem Zeitpunkt wird euch egrep noch nicht besser als fgrep vorkommen. Das aendert sich bald.)

8) Verwende egrep fuer ein Stueck Quellcode, der Sonderzeichen enthaelt. Schreibe dafuer egrep-Ausdruecke, die Sterne, Klammern und Punkte matchen.


Inputtext: schaebische-kunde.txt NoPaste-Eintrag41651
Use ed(1) once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 22.04.2022 12:25:49

Diese Einheit ist recht kurz und mehr eine Zwischeneinheit, die ich als Grundlage brauche. Wenn das fuer euch zu einfach und zu wenig ist, gerade auch nach der Osterpause, dann koennte ich den naechsten richtigen Inhaltsteil auch schon am Sonntag hochladen. Erst wollte ich beides in einen Teil nehmen, fand es dann aber strukturell doch besser wenn es zwei Einzeleinheiten sind.

Schreibt mir gerne ob ihr gleich schon mehr Nachschub wollt oder ob das fuer die naechste Woche ausreichend ist.


Nachtrag: Falls die Verwendung von egrep auf der Kommandozeile nicht allen gelaeufig ist, dann kurz Bescheid sagen (wenn's euch lieber ist auch per PM) und ich erklaere das noch ausfuehrlicher.
Use ed(1) once in a while!

TuxPeter
Beiträge: 1757
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von TuxPeter » 22.04.2022 17:33:27

Hi,
ist für mich prima so. Danke dafür! Habe mich jetzt mit egrep mal durchgetestet, fgrep mach' ich später. Werde mal versuchen zu verstehen, was der Unterschied zwischen beiden ist. (habe aufgrund von man grep schon 'ne Vermutung, die will ich hier aber noch für mich behalten)

leolein
Beiträge: 72
Registriert: 03.06.2009 23:15:08
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von leolein » 22.04.2022 18:11:38

Zumindest fuer mich nicht zu einfach, eher genau richtig um auch mal ein wenig mitmachen zu koennen statt nur staunend zuzuschauen. Auf Teil 04 schon am kommenden Sonntag wuerde ich mich also freuen. :)

Teil 02 habe ich vorerst auf spaeter verschoben. Das verwirrte mich mehr als mir lieb war. :mrgreen:

Noch etwas schwer tue ich mich mit folgenden Dingen:
  • Du schreibst hier immer mit voran gestellten `` statt mit ", so wie Du es am Ende eines Suchstrings tust. Mich, als total leicht zu verunsichernden Anfaenger, verwirrst Du damit. An anderer Stelle kannst Du Deiner Tastatur offensichtlich ein ' und " entlocken. Welchen Sinn ergibt diese Schreibweise?
  • Nachdem ich von Beginn des Kurses an nicht so recht verstanden habe welche Zeichen mit Standardzeichen gemeint sind (also nicht ob Meta- oder literal sondern welche Zeichen an sich) bzw. welche nicht, ist hier
    Meillo hat geschrieben: ↑ zum Beitrag ↑
    22.04.2022 12:21:34

    Code: Alles auswählen

    \.[]()*+?{}|^$
    
    wohl ein Teil der Antwort, welche auf keinen Fall Standardzeichen sein koennen. Offensichtlich weiss ich noch immer nicht was Sonderzeichen/Steuerzeichen sind. Ich haette hierzu ebenfalls ein !, : oder auch ein , zu den Zeichen gezaehlt, die man escapen muss. Muss man aber zumindest in diesen Aufgaben wohl nicht?
Zu Aufgabe 1 bis 7 konnte ich brauchbare Ergebnisse erzielen. Ich habe egrep auf die verlinkte Textdatei angewandt, sonst haette ich die Unterschiede mit der Option -o und ohne diese, sowie den Unterschied zwischen egrep und fgrep so schnell nicht sehen koennen. Fuer Aufgabe 8 nehm ich mir noch Zeit bis Sonntag.

inne
Beiträge: 3058
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von inne » 22.04.2022 18:45:30

leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
Fuer Aufgabe 8 nehm ich mir noch Zeit bis Sonntag.
Dafür wäre der Linux Quellcode ganz nett 8)
Ist mitunter als Tarball im Paket Debianlinux-source.

Wie ich jetzt darauf komme, kann hier nachgelesen werden:
https://www.linux-magazin.de/ausgaben/2 ... fuehrung2/
https://www.derstandard.at/story/639140 ... fuck-count

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 22.04.2022 18:53:08

leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
Noch etwas schwer tue ich mich mit folgenden Dingen:
  • Du schreibst hier immer mit voran gestellten `` statt mit ", so wie Du es am Ende eines Suchstrings tust. Mich, als total leicht zu verunsichernden Anfaenger, verwirrst Du damit. An anderer Stelle kannst Du Deiner Tastatur offensichtlich ein ' und " entlocken. Welchen Sinn ergibt diese Schreibweise?
Versuche dich daran nicht zu stoeren. Das ist nicht anders als wie wenn manche Personen in Briefen ``Du'' gross schreiben und manche klein. Manche ruecken die erste Zeile eines Absatzes ein und andere nicht. Manche schreiben immer noch ``Schi'' und nicht ``Ski''. So verwende ich an dieser Stelle Anfuehrungszeichen, die heutzutage aus der Mode gekommen sind, frueher aber ueblich waren. Es ist einfach nur eine typografische Eigenart und hat keine weitere Bedeutung.

leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
  • Nachdem ich von Beginn des Kurses an nicht so recht verstanden habe welche Zeichen mit Standardzeichen gemeint sind (also nicht ob Meta- oder literal sondern welche Zeichen an sich) bzw. welche nicht, ist hier
    Meillo hat geschrieben: ↑ zum Beitrag ↑
    22.04.2022 12:21:34

    Code: Alles auswählen

    \.[]()*+?{}|^$
    
    wohl ein Teil der Antwort, welche auf keinen Fall Standardzeichen sein koennen. Offensichtlich weiss ich noch immer nicht was Sonderzeichen/Steuerzeichen sind. Ich haette hierzu ebenfalls ein !, : oder auch ein , zu den Zeichen gezaehlt, die man escapen muss. Muss man aber zumindest in diesen Aufgaben wohl nicht?
Das ist leider ein Dilemma. Ich verstehe den Wuensch, das abstrakte Konstrukt von Metazeichen, in konkreten Beispielen greifen zu koennen. Allerdings reicht es nicht aus, nur konkrete Zeichen zu lernen, weil du das abstrakte Konzept verstehen lernen musst. Je nach RE-Variante und je nach Stelle innerhalb eines Regulaeren Ausdrucks sind naemlich unterschiedliche Zeichen Metazeichen. Auch musst du dich von dir bereits bekannten Zeichenkategorien loesen. Zwar sind vor allem Sonderzeichen Metazeichen, aber halt nur manche davon. So ist z.B. das Fragezeichen in manchen RE-Varianten ein Metazeichen und in anderen nicht; das Ausrufezeichen ist es aber nie, ausser in ganz bestimmten Kontellationen einer bestimmten RE-Variante. Nach und nach wirst du in diesem Kurs die verschiedenen Metazeichen kennenlernen und was sie bedeuten. Da dies jedoch bei den RE-Varianten teilweise unterschiedlich ist, ist es insgesamt wichtiger, zu verstehen, dass es Metazeichen fuer bestimmte Operationen und Zusatzinformationen gibt, auch wenn die in unterschiedlichen RE-Varianten unterschiedlich geschrieben werden.

Ich hoffe, das verwirrt dich nicht noch mehr. Leider ist es einfach sehr verwirrend. :roll:

Immerhin hast du nun ja mal eine Liste, die zumindest grob fuer egrep passt. Daran kannst du dich orientieren. Der Rest kommt dann sicher mit der Praxis von alleine. Mit jeder weiteren Einheit wird es leichter werden.

leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
Zu Aufgabe 1 bis 7 konnte ich brauchbare Ergebnisse erzielen. Ich habe egrep auf die verlinkte Textdatei angewandt, sonst haette ich die Unterschiede mit der Option -o und ohne diese, sowie den Unterschied zwischen egrep und fgrep so schnell nicht sehen koennen.
Sehr gut! Weiter so! :THX:
Use ed(1) once in a while!

leolein
Beiträge: 72
Registriert: 03.06.2009 23:15:08
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von leolein » 22.04.2022 19:29:50

Meillo hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:53:08
leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
  • Nachdem ich von Beginn des Kurses an nicht so recht verstanden habe welche Zeichen mit Standardzeichen gemeint sind (also nicht ob Meta- oder literal sondern welche Zeichen an sich) bzw. welche nicht, ist hier
    Meillo hat geschrieben: ↑ zum Beitrag ↑
    22.04.2022 12:21:34

    Code: Alles auswählen

    \.[]()*+?{}|^$
    
    wohl ein Teil der Antwort, welche auf keinen Fall Standardzeichen sein koennen. Offensichtlich weiss ich noch immer nicht was Sonderzeichen/Steuerzeichen sind. Ich haette hierzu ebenfalls ein !, : oder auch ein , zu den Zeichen gezaehlt, die man escapen muss. Muss man aber zumindest in diesen Aufgaben wohl nicht?
[...]Auch musst du dich von dir bereits bekannten Zeichenkategorien loesen.[...]
Dieser Satz ist der Volltreffer. :D

Ich dachte, diese Kategorien (wer oder was auch immer mich diese gelehrt hat...) waeren auch hier zumindest nicht ungueltig. Wenn die aber hier ueberhaupt nicht zu gebauchen sind... daran soll es nicht liegen. *lehntsichueberdieRelingundwirftsieueberBord*
Meillo hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:53:08
[...]Ich hoffe, das verwirrt dich nicht noch mehr. Leider ist es einfach sehr verwirrend. :roll:[...]
Keineswegs! Ich danke Dir. :THX:

(EDIT: Rechtschreibung.)

curt123
Beiträge: 636
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: RegExp-Kurs 03: egrep

Beitrag von curt123 » 24.04.2022 11:57:51

Meillo hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:53:08
leolein hat geschrieben: ↑ zum Beitrag ↑
22.04.2022 18:11:38
Noch etwas schwer tue ich mich mit folgenden Dingen:
  • Du schreibst hier immer mit voran gestellten `` statt mit ", so wie Du es am Ende eines Suchstrings tust. Mich, als total leicht zu verunsichernden Anfaenger, verwirrst Du damit. An anderer Stelle kannst Du Deiner Tastatur offensichtlich ein ' und " entlocken. Welchen Sinn ergibt diese Schreibweise?
Versuche dich daran nicht zu stoeren. Das ist nicht anders als wie wenn manche Personen in Briefen ``Du'' gross schreiben und manche klein. Manche ruecken die erste Zeile eines Absatzes ein und andere nicht. Manche schreiben immer noch ``Schi'' und nicht ``Ski''. So verwende ich an dieser Stelle Anfuehrungszeichen, die heutzutage aus der Mode gekommen sind, frueher aber ueblich waren. Es ist einfach nur eine typografische Eigenart und hat keine weitere Bedeutung.
Bei der Typografie gibt es ja noch regionale Unterschiede. Traditionell wäre hier wohl „“ üblich. Vielleicht taugt das bei Interesse als erste einfache Übersicht mit Tastaturinfos: https://infothek.rotkel.de/tastaturkuer ... ichen.html

Da es aber ja auch um Anwendung bei Script-Sprachen oder Programmierung geht: Üblich sind ", ' und ggf. `. Doppelte und einfache Anführungszeichen ( " ' ) können häufig ähnlich genutzt werden. Backticks (grave accent) ( ` ) können -wenn (so) unterstützt- gewissermassen eine Ebene höher gehen. Verschachtelungen können vereinfacht so ausschauen: ' " " ' .

Z.B. bei der Kombination von HTML (ausgegebene Webseite), PHP (auf dem Server um das HTML/die Webseite komfortabel zu generieren, statt statische Dateien auszuliefern, ggf. auch JavaScript in ähnlicher Funktion) und SQL ( Abfrage / Datenbeschaffung aus einer Datenbank). Da sollen im HTML-Code, wie er beim Besucher/Browser einer Seite ankommt, für interne Zwecke eher dopelte Anführungszeichen verwendet werden. Die einfachen Anführungszeichen ermöglichen z.B., HTML-Code Passagen inklusive enthaltener doppelter Anführungszeichen in PHP besser verarbeiten zu können, und auch bei JavaScript kann es sinnvoll sein. Ähnliches bei SQL, wobei es mit Backticks dann noch weitere Möglichkeiten für Suchanfragen bei SQL gibt. Bei JavaScript gibt es auch die Verwendung von Backticks als Template literals, etwa um komfortabel und übersichtlich mehrzeilige Strings verwenden zu können.

Wenn meine Ausführung zu kurz oder fehlerhaft sein sollte bitte ich um Korrektur, Ergänzung o.ä..

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 27.04.2022 08:02:23

Zur Erinnerung: Heute ist Mittwoch und ihr koennt eure Loesungen posten.

Am Freitag kommt der naechste Teil.
Use ed(1) once in a while!

Benutzeravatar
tegula
Beiträge: 423
Registriert: 04.06.2004 13:51:04
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von tegula » 28.04.2022 08:40:41

Meillo hat geschrieben: ↑ zum Beitrag ↑
27.04.2022 08:02:23
Zur Erinnerung: Heute ist Mittwoch und ihr koennt eure Loesungen posten.
Dann fang ich mal an: NoPaste-Eintrag41657
Korrektur zu meinem NoPaste-Upload (Aufgabe 2 bzw. Zeile 43-48, "Viele" (falsch abgeschrieben) durch "Viel" (richtig abgeschrieben) ersetzt):

Code: Alles auswählen

$ # Aufgabe 2) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Viel Steine'' matcht.
$ ## nur Ausdruck
$ egrep -o "Viel Steine" schwaebische-kunde.txt
Viel Steine
$ ## ganze Zeile
$ egrep "Viel Steine" schwaebische-kunde.txt
Viel Steine gab's und wenig Brot,
$ 
Meillo hat geschrieben: ↑ zum Beitrag ↑
27.04.2022 08:02:23
Am Freitag kommt der naechste Teil.
Danke! Freue mich auf den nächsten Teil. :)

EDIT (28.04.2022 um ungefähr 09 Uhr): Flüchtigkeitsfehler in Aufgabe 2 korrigiert.
Zuletzt geändert von tegula am 28.04.2022 09:09:12, insgesamt 4-mal geändert.

TuxPeter
Beiträge: 1757
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von TuxPeter » 28.04.2022 08:57:05

Will jetzt nicht Lösungen posten, weil die Aufgaben auch ziemlich offen sind und zu allerlei Spielerei veranlassen. Nur so als Anmerkung:

Code: Alles auswählen

4)  cat schwaebische-kunde.txt | egrep -o "Er sprach: \"Sagt an,"
5)  cat schwaebische-kunde.txt | egrep -o "eben\."
6)  cat schwaebische-kunde.txt | egrep  "\?"
Ohne die Anf.Zeichen trennt die Shell den Parameter für grep beim 1. Blank ab. Man kann dieses Blank escapen oder eben den ganzen Suchstring in Anf.Zeichen einfügen. Sonderzeichen wie Punkt und Fragezeichen müssen escaped werden, weil sie Metazeichen sind.
(Übrigens: Der blutrünstige Uhland-Text ist für diesen Zweck sehr brauchbar.)

Code: Alles auswählen

cat pas/RegExSpielerei.pas | egrep -n5 "/\*"
Beginn mehrz. Kommentar +/- 5 Zeilen
Für die Suche in Programmen habe ich mal mein Pascal-Programm vorgenommen und nach einem mehrzeiligen Kommentar gesucht, welcher mit "/*" eingeleitet wird. Dass +/- 5 Zeilen gezeigt werden, geht aber nicht auf das Konto von RegEx, sondern auf den Parameter für grep. Schätze, hier lernen wir bald bessere Suchmöglichkeiten.

@tegula: Unsere Beiträge haben sich überschnitten.

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 28.04.2022 09:54:21

Das sieht ja schon gut aus!

Geht bitte nochmal genauer auf Aufgabe 4 ein:
4) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Er sprach: "Sagt an,'' matcht.
Wie sieht es da mit dem Escapen aus?

Dort muessen wir genau hinschauen und verschiedene Dinge auseinander halten.

Verwendet z.B. mal `egrep -f datei', mit dem man eine Datei uebergeben kann, in der die RE drin steht. Wie sieht die RE dann aus? Unterschiede? Warum?

Ist das bei manchen der anderen Aufgaben auch so?
Use ed(1) once in a while!

Huo
Beiträge: 384
Registriert: 26.11.2017 14:03:31

Re: RegExp-Kurs 03: egrep

Beitrag von Huo » 28.04.2022 10:16:33

Ich habe die Suchmuster (außer bei Aufgabe 3!) immer in einfache Anführungszeichen eingeschlossen. Dann komme ich bei Aufgabe 4 ohne Escapen aus:

Code: Alles auswählen

$ egrep 'Er sprach: "Sagt an' schwaebische-kunde.txt
Er sprach: "Sagt an, mein Ritter werth!
Mich würde interessieren, ob es für Aufgabe 3) auch eine Lösung mit einfachen Quotes gibt. Ich habe keine gefunden.

Code: Alles auswählen

$ egrep 'heil\'gen' schwaebische-kunde.txt
> 
$ egrep "heil'gen" schwaebische-kunde.txt
Zum heil'gen Land gezogen kam,
$ egrep -f file.txt schwaebische-kunde.txt
Zum heil'gen Land gezogen kam,
wobei file.txt nur aus der Zeile

Code: Alles auswählen

heil'gen
besteht.

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 28.04.2022 13:00:54

Kleiner Exkurs zur Shell.

Das hat nichts mit Regulaeren Ausdruecken zu tun! ... wobei das Konzept des Escapens natuerlich wiederkehrend ist und darum eine gute Denkuebung darstellt.

Huo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 10:16:33
Mich würde interessieren, ob es für Aufgabe 3) auch eine Lösung mit einfachen Quotes gibt. Ich habe keine gefunden.
Vermutlich weisst du schon genug, um dir die Antwort selber abzuleiten. Ich kann dir dann nur noch sagen, dass du recht hast und es keine Sonderfaelle gibt, die du nicht bedacht hast. ;-)

Folgendes ist die vollstaendige Beschreibung des Verhaltens der Shell bei Single-Quotes:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02 hat geschrieben: Enclosing characters in single-quotes ( '' ) shall preserve the literal value of each character within the single-quotes. A single-quote cannot occur within single-quotes.
Nochmal auf Deutsch und etwas anders formuliert: Nach einem beginnenden Single-Quote (= einfaches Anfuehrungszeichen; Aspostroph) werden alle Zeichen bis zum naechsten, abschliessenden Single-Quote literal interpraetiert.

Wenn nach dem beginnenden Single-Quote alle Zeichen literal sind ausser dem naechsten Single-Quote, das den gequoteten String beendet, dann gibt es innerhalb des Single-Quote-Strings keine Moeglichkeit eines Escapens. Es ist logisch unmoeglich, weil es dazu ein Escapezeichen braeuchte, das eine Sonderbedeutung hat. Aber wie oben steht, hat kein Zeichen eine Sonderbedeutung ... ausser das naechste Single-Quote, das aber den Single-Quoted-String schon beendet.

Folglich kann man in einen Single-Quoted-String alle Zeichen reinschreiben und jedes wird literal interpraetiert ... bloss einen Single-Quote kann man nicht aufnehmen.


Allerdings kann man in der Shell zwei Strings direkt aneinander schreiben, um sie zu konkatenieren ... also, dass sie zu einem einzigen String werden. Z.B. auf diese Arten:

Code: Alles auswählen

"foo""bar"
'foo''bar'
"foo"'bar'
Nun ist ein Single-Quote innerhalb eines Double-Quote-Strings literal (wie ihr in euren Aufgaben ja auch demonstriert habt:

Code: Alles auswählen

"heil'gen"
Ein einzelnes literales Single-Quote kann man in der Shell also so schreiben: Dann kombinieren wir das doch mal mit zwei Strings in Single-Quotes:

Code: Alles auswählen

'heil'"'"'gen'
... ist jetzt alles klar? ;-)
Use ed(1) once in a while!

Huo
Beiträge: 384
Registriert: 26.11.2017 14:03:31

Re: RegExp-Kurs 03: egrep

Beitrag von Huo » 28.04.2022 15:35:45

Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 13:00:54
Folgendes ist die vollstaendige Beschreibung des Verhaltens der Shell bei Single-Quotes:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02 hat geschrieben: Enclosing characters in single-quotes ( '' ) shall preserve the literal value of each character within the single-quotes. A single-quote cannot occur within single-quotes.
Danke, das war mir so bislang nicht bewusst! Ich sehe gerade auch, dass das fast wörtlich genauso in der Manpage für Bash steht:
man bash hat geschrieben:Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
Dies scheint allerdings nicht für alle Shells zu gelten. Die Fish-Shell hat mit dem Escapen von in einfachen Anführungszeichen eingeschlossenen einfachen Anführungszeichen keine Probleme :mrgreen::

Code: Alles auswählen

$ fish
$ egrep 'heil\'gen' schwaebische-kunde.txt
Zum heil'gen Land gezogen kam,

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 28.04.2022 15:54:46

Darauf faellt mir nur eines ein: <°)))))><


:mrgreen:
Use ed(1) once in a while!

Benutzeravatar
tegula
Beiträge: 423
Registriert: 04.06.2004 13:51:04
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von tegula » 28.04.2022 16:39:09

Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Geht bitte nochmal genauer auf Aufgabe 4 ein [...] Wie sieht es da mit dem Escapen aus?
Das (doppelte) Anführungszeichen muss escapet werden. Die restlichen Zeichen müssen nicht escapet werden.
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Verwendet z.B. mal `egrep -f datei', mit dem man eine Datei uebergeben kann, in der die RE drin steht. Wie sieht die RE dann aus? Unterschiede? Warum?
Der RE muss weder in Anführungszeichen gesetzt noch escapet werden (NoPaste-Eintrag41664, Zeile 5–13).
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Ist das bei manchen der anderen Aufgaben auch so?
Bei Aufgabe 1,2 und 3 ist es auch so. Bei Aufgabe 5 und 6 funktioniert die Nutzung einer Musterdatei bei mir (noch?) nicht (NoPaste-Eintrag41664, Zeile 15 ff.). Was mach ich falsch?

Huo
Beiträge: 384
Registriert: 26.11.2017 14:03:31

Re: RegExp-Kurs 03: egrep

Beitrag von Huo » 28.04.2022 16:51:45

tegula hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:39:09
Bei Aufgabe 5 und 6 funktioniert die Nutzung einer Musterdatei bei mir (noch?) nicht [...] Was mach ich falsch?
Ich hab's auch erst nach einigen Fehlversuchen begriffen: Da der Text der Musterdatei als RE übernommen wird, musst Du in ihr Sonderzeichen escapen, wenn sie literal interpretiert werden sollen.

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 28.04.2022 16:52:12

tegula hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:39:09
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Geht bitte nochmal genauer auf Aufgabe 4 ein [...] Wie sieht es da mit dem Escapen aus?
Das (doppelte) Anführungszeichen muss escapet werden. Die restlichen Zeichen müssen nicht escapet werden.
Warum muss das doppelte Anfuehrungszeichen escapet werden? Ist das ein Zeichen mit Sonderbedeutung in der RE?

Warum ist es nicht der Fall wenn du es mit `-f datei' machst?
tegula hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:39:09
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Verwendet z.B. mal `egrep -f datei', mit dem man eine Datei uebergeben kann, in der die RE drin steht. Wie sieht die RE dann aus? Unterschiede? Warum?
Der RE muss weder in Anführungszeichen gesetzt noch escapet werden (NoPaste-Eintrag41664, Zeile 5–13).
tegula hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:39:09
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 09:54:21
Ist das bei manchen der anderen Aufgaben auch so?
Bei Aufgabe 1,2 und 3 ist es auch so. Bei Aufgabe 5 und 6 funktioniert die Nutzung einer Musterdatei bei mir (noch?) nicht (NoPaste-Eintrag41664, Zeile 15 ff.). Was mach ich falsch?
Sehr gut! Du bist genau am Knackpunkt. ;-)

Arbeite vorerst mal nur mit den Musterdateien und gehe dafuer die Einheit nochmal durch. Mit Musterdateien ist es wie ich beschreibe. Wenn du es auf der Kommandozeile angibst, dann treten weitere Effekte auf, die dich nun verwirren.

Schritt fuer Schritt. Das sind wichtige Lernstufen, an denen du gerade rumkletterst. :THX:
Use ed(1) once in a while!

TuxPeter
Beiträge: 1757
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von TuxPeter » 28.04.2022 19:18:35

Nochmal zum Escapen: Kann man ja auch alles einzeln machen:

Code: Alles auswählen

egrep -o  Er\ sprach:\ \"Sagt\ an, schwaebische-kunde.txt 
Er sprach: "Sagt an,
Übrigens: Da habe ich immer fein mit Pipe so cat file | usw gearbeitet und sehe nun, dass das der grep ganz alleine kann. So what!

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 28.04.2022 20:47:06

Der Knackpunkt im Verstaendnis ist, dass hier zwei separate Arten von Escaping im Spiel sind, die dummerweise beide den Backslash verwenden. Es gilt zu verstehen, welche Backslashes von der Shell interpretiert werden und welche Teil der RE sind und von egrep interpretiert werden!

Indem man `egrep -f datei' verwendet, kann man die Shell eliminieren und alle Backslashes die dann noch in der Datei sind, gehoeren zur RE.

Wenn man die RE direkt als Kommandozeilenargument angibt wird es etwas schwieriger. Wie waere es beispielsweise mit:

Code: Alles auswählen

egrep "\\\\\\\\"
Auf was matcht das? Und wie sieht die gleiche RE aus wenn man sie in eine Datei schreibt und diese mit `-f' nutzt?

Ihr koennt die ganzen Backslashes ja mal farbig markieren, je nachdem wie und von wem sie interpretiert werden. ;-)
Use ed(1) once in a while!

Huo
Beiträge: 384
Registriert: 26.11.2017 14:03:31

Re: RegExp-Kurs 03: egrep

Beitrag von Huo » 29.04.2022 14:50:17

Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 20:47:06
Wenn man die RE direkt als Kommandozeilenargument angibt wird es etwas schwieriger. Wie waere es beispielsweise mit:

Code: Alles auswählen

egrep "\\\\\\\\"
Auf was matcht das? Und wie sieht die gleiche RE aus wenn man sie in eine Datei schreibt und diese mit `-f' nutzt?
Als ich egrep "\\\\\\\\" auf einen Quelltext loslies, merkte ich zu meiner anfänglichen Verblüffung, dass doppelte literale Backslashes (\\) gematcht werden. Dafür benötigt man acht Backslashes? 8O

Nach einiger Tüftelei erkläre ich mir dies folgendermaßen:

Aus Sicht der Shell handelt es sich bei den acht Backslashes um vier literale Backslashes, da ein Paar von Escapezeichen, wie in der zweiten Lektion gelernt, jeweils für das literale Zeichen steht (gilt wohl auch hier, auch wenn es dabei nicht um REs geht).

An egrep werden also vier Backslash-Zeichen übergeben. Das sind nun also zwei Escapezeichen-Paare, was zwei literalen Backslashes entspricht. q.e.d. :wink:

In der Datei für die Option -f genügen vier Backslashes statt acht, um die gleiche RE zu erhalten, da hier egrep die Zeichen quasi an der Shell vorbei gereicht bekommt.
Ebenso reichen vier Backslashes aus, wenn ich sie statt in doppelte in einfache Anführungszeichen setze (da die Bash-Shell innerhalb einfacher Anführungszeichen nur literale Zeichen kennt ...).

Benutzeravatar
tegula
Beiträge: 423
Registriert: 04.06.2004 13:51:04
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 03: egrep

Beitrag von tegula » 29.04.2022 15:42:47

Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:52:12
Sehr gut! Du bist genau am Knackpunkt. ;-)
Huo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:51:45
tegula hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:39:09
Bei Aufgabe 5 und 6 funktioniert die Nutzung einer Musterdatei bei mir (noch?) nicht [...] Was mach ich falsch?
Ich hab's auch erst nach einigen Fehlversuchen begriffen: Da der Text der Musterdatei als RE übernommen wird, musst Du in ihr Sonderzeichen escapen, wenn sie literal interpretiert werden sollen.
Danke Huo und Meillo :THX: :). Der Unterschied zwischen Shell-Metazeichen und egrep-Metazeichen war mir nicht bewusst :oops:
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 16:52:12
Arbeite vorerst mal nur mit den Musterdateien und gehe dafuer die Einheit nochmal durch. Mit Musterdateien ist es wie ich beschreibe. Wenn du es auf der Kommandozeile angibst, dann treten weitere Effekte auf, die dich nun verwirren.

Schritt fuer Schritt. Das sind wichtige Lernstufen, an denen du gerade rumkletterst. :THX:
Hab das jetzt so umgesetzt :) --> NoPaste-Eintrag41672

EDIT (01.Mai um 17:50 Uhr): NoPaste-Upload bzw. NoPaste-Link aktualisiert sowie Rechtschreibfehler korrigiert.
Zuletzt geändert von tegula am 01.05.2022 17:49:53, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 7526
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 29.04.2022 21:21:34

Eben habe ich den naechsten Teil veroeffentlich, weil ich gesagt hatte, dass er am Freitag kommt. Mit diesem Teil 03 hier bin ich eigentlich noch nicht ganz fertig. Ich schaue mir das in den naechsten Tagen nochmal durch, damit wir alle noch offenen Enden auch abschliessen.

Im Moment ist die Zeit etwas eng (weil das Wetter so gut ist ;-) ). Die darauffolgende Einheit ist aber auch schon zu 90% fertig und die zwei danach habe ich schon konzipiert. Das schafft zumindest mal ein gutes Gefuehl ... nicht dass es mir wieder wie an Ostern geht. Nochmal will ich euch nicht ohne was sitzen lassen muessen. ;-)

Weiterhin viel Vergnuegen damit. Eure Mitarbeit freut mich jedes Mal sehr! :THX:
Use ed(1) once in a while!

Benutzeravatar
heisenberg
Beiträge: 2241
Registriert: 04.06.2015 01:17:27

Re: RegExp-Kurs 03: egrep

Beitrag von heisenberg » 04.05.2022 16:08:21

IdRegExpKurs2022

Antworten