Diese Schreibweise fuehrt die Ersetzung in allen Zeilen durch, wobei die meisten davon scheitern werden. Meine Variante fuehrt sie nur in den Zeilen aus, in denen sie erfolgreich sein wird. Das ich sinngemaess zutreffender das was man eigentlich haben will und weniger der Holzhammeransatz. Im Endeffekt macht es keinen Unterschied, ich finde das eine nur logisch passender, darum verwende ich es eher (was aber nicht heisst, dass ich deine Variante nicht oft genug ebenso verwenden wuerde).hikaru hat geschrieben:10.02.2020 15:51:22Gibt es einen Grund, warum du diese Schreibweise gewählt hast, und nicht die in meinen Augen verbreitetere?:Meillo hat geschrieben:10.02.2020 15:08:14Nun zum interessanten Teil, was das sed-Programm macht.
Es besteht aus nur genau einem Befehl, naemlich dem `s'-Befehl. Das vor dem `s' ist eine Adresse in Form eines regulaeren Ausdrucks, der bestimmt auf welche Zeilen in der Eingabe der s-Befehl angewendet werden soll.Code: Alles auswählen
/^{\([0-9][0-9]*\) .*}$/s//-\1-/
Code: Alles auswählen
's/^{\([0-9][0-9]*\) .*}$/-\1-/'
... aber nur wenn man die nicht-POSIX-Erweiterung `-E' verwendet. Historisch und nach POSIX kann sed nur BREs und die kennen kein `+'.Weiterhin könnte man das Pattern logisch vereinfachen, jetzt da wir wissen, dass es führende Nullen gibt:Code: Alles auswählen
^{\([0-9]\+\) .*}$
Den Abseits-Vergleich finde ich nicht ganz treffend, aber ich verstehe was du sagen willst. Die zwei Hauptgruende, warum die Leute keine REs koennen sind:Regex sind wie Abseits. Entweder hat man verstanden wie sie funktionieren, oder nicht.
1) Sie versuchen es gleich gar nicht, weil sie vom kryptischen (d.h. ungewohnten) Aussehen abgeschreckt sind.
2) Sie koennen nicht stupide genug Parser spielen.
REs zu lesen wird einfach, sobald mal sein Vermutungs-Hirn abschaltet und stupide Regeln abarbeitet. So viele Regeln sind es bei REs gar nicht. (EREs sind IMO die einfachste weil einheitlichste Variante; PCREs haben den meisten Schickschnack.)
Wenn man REs schnell lesen koennen will, dann muss man, wie auch beim Grundschullesenlernen und beim Programmierenlernen, sich ein Pattern-Matching aneignen. Man muss Strukturen erkennen lernen ... auf einen Blick sehen was zusammen gehoert und was separate Teile sind. Ausserdem in welchem Kontext sich etwas befindet. So ist ein Stern beispielsweise fast immer ein Quantifier fuer das was davor steht, ausser er ist escapet oder steht in einer Zeichenklasse, dann ist er literal aufzufassen.
Das ist von der Herausforderung nichts anderes als die Lateinische Schrift oder eine Handschrift oder Suetterlin oder Chinesische Schriftzeichen lesen zu lernen. Der identische Vorgang, gleich einfach oder schwierig -- ganz wie man es bewerten will -- nur dass REs eine sehr viel kleinere Sprache mit weniger Regeln sind als all die anderen.
War es nicht Knuth der meinte:Im Prinzip ja, aber ...Lord_Carlos hat geschrieben:10.02.2020 15:22:16Spricht sed nicht den gleichen syntax wie regex in z.B. Javascript, java oder python?
... Ich glaube, die Inkompatibilität beruht auf zwei Umständen:
1. Verschiedene Rexex-Implementationen nutzen verschiedene Erweiterungen.
2. Die Escaping-Regeln unterscheiden sich zwischen den Implementationen.
Ganz falsch liegt er damit nicht.Unix is 14 different kinds of regular expressions living under one roof.
Es gibt verschiedene Varianten von REs, bekannt sind beispielsweise die BREs und EREs von POSIX und PCRE von Perl. Das sind aber nur Standardisierungen, also die Dokumentation von Gemeinsamkeiten von Implementierungen. Dann gibt es noch die Implementierungen, die den Standards aehneln, aber Abweichungen enthalten.
Sed verwendet normalerweise BREs, kann aber mit `-E' (bei GNU sed) um ein paar ERE-Funktionen erweitern, aber eben nicht kompatibel, weil in EREs das Plus unescapet die Sonderbedeutung hat, waehrend es bei gsed nur escapet die Sonderbedeutung hat. Da kollidieren eben die Historie von sed (+ ist literal) mit der Grundidee von EREs (jedes escapte Zeichen ist literal).
Dieses Wirrwarr zu durchschauen ist wirklich schwer.