Wie werden Ziffern gefolgt von einem Punkt mit sed abgeglichen?

76

Ich versuche zu verwenden , sedalle Muster zu ersetzen , mit Ziffern , unmittelbar gefolgt von einem Punkt (wie 3., 355.) durch einen leeren String. Also versuche ich:

sed 's/\d+\.//g' file.txt

Aber es geht nicht. Warum ist das so?

Mika H.
quelle
1
Ich fand diesen Artikel sehr nützlich
Stphane

Antworten:

111

Weil sed nicht perliert ist, haben reguläre Ausdrücke keine \dAbkürzung:

sed 's/[[:digit:]]\+\.//g'

Hier finden Sie eine Dokumentation zu regulären Ausdrücken .

Glenn Jackman
quelle
3
Das ist, wenn Sie null oder mehr Stellen möchten . /[[:digit:]]*\. /stimmt mit der Zeichenfolge überein, foo.da Sie keine Ziffern zulassen. Wenn Sie eine oder mehrere \+wie gezeigt verwenden möchten
Glenn Jackman
71

Zwei Probleme:

  1. sedunterstützt nicht \d. Verwenden Sie [0-9]oder [[:digit:]].

  2. +muss die besondere Bedeutung bekommen backslashed werden: \+.

Choroba
quelle
6
Anstatt das + (was zum Beispiel unter Mac OS X nicht funktioniert) mit einem Backslash zu versehen, können Sie die Option -E verwenden interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).. Dies hilft
leider
4
@gmale: -Efunktioniert nicht für GNU sed, sondern wird -rstattdessen verwendet.
Choroba
12
Okay ... es sieht aus wie sednur scheiße, wenn es um Portabilität geht ...
Iconoclast
@choroba Ich glaube, ich habe mich heute verwirrt. Ich werde meine lauten Kommentare löschen ...
Steven Lu
Grundsätzlich wollte ich die Leute warnen: Wenn Sie in BSD sed kein erweitertes Regex verwenden ( -Eauf BSD sed und -rauf GNU sed), funktionieren weder ( +noch \+mit ?) überhaupt etwas, wohingegen dies in GNU sed möglich ist Bringen Sie sie dazu, mit dem Backslash zu arbeiten. Daher die allgemeine Empfehlung zur Verwendung von Extended Regex in Skripten
Steven Lu
3

Die Manpage sed verweist auf die Manpage re_format. Es werden zwei Unterscheidungen getroffen: (1) obsolet gegenüber erweiterten regulären Ausdrücken; (2) Nicht verbesserte versus verbesserte reguläre Ausdrücke. Alle 4 Kombinationen sind möglich. In sed wird sowohl veraltete als auch erweiterte Unterstützung angeboten, in beiden Fällen jedoch nur für nicht weiterentwickelte. Der Operator \ d ist eine Funktion erweiterter regulärer Ausdrücke, die von sed nicht unterstützt wird.

Jonathan Pool
quelle