ubuntuusers.de

RegEx negieren (mit sed)

Status: Gelöst | Ubuntu-Version: Ubuntu 20.10 (Groovy Gorilla)
Antworten |

Grafinger

Anmeldungsdatum:
29. April 2020

Beiträge: Zähle...

Hallo,

ich möchte mit sed den Anfang einer Zeile durch ein HTML-Tag ersetzen (bzw. einfügen), und zwar dann, wenn diese Zeile NICHT mit einem bestimmten Pattern - :s1, :s2 etc. - beginnt.

1
2
echo ":s2 meinText" # Diese Zeile soll so bleiben
echo "meinText" # Soll so hier aussehen: <div>meinText

Stehe irgendwie auf dem Schlauch.. Ich weiß, dass ich das bei RegEx wohl mit ^ machen kann, weiß aber nicht so recht, wohin damit. Bei normalen Ersetzen ala 's/ab/cd/' komme ich zurecht. Hat jemand einen Tip?

Dankeschön Grafinger

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

1
echo "meinText" | sed -r 's/^([^:])/<div>&/' 

Das -r hilft dabei, runde Klammern zu verwenden.

  • s := substitute /PATTERN/ERSETZUNG/

  • ^ := Anker für Zeilenanfang

  • [] := Gruppe von Zeichen (kann die Größe 1 haben, z.B. für die Negation)

  • [^:] := Negation der Zeichen (hier des Doppelpunkts)

  • & := das gematchte Pattern (hier "m" von meinText", welches das erste Zeichen nach Zeilenanfang und kein Doppelpunkt

ist.)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

Grafinger schrieb:

Stehe irgendwie auf dem Schlauch.. Ich weiß, dass ich das bei RegEx wohl mit ^ machen kann, weiß aber nicht so recht, wohin damit.

An den Anfang des Musters, denn Du willst ja am Zeilenanfang ankern.

Bei normalen Ersetzen ala 's/ab/cd/' komme ich zurecht. Hat jemand einen Tip?

Du kannst die Negation der Adresse mit "!" nutzen:

1
2
3
4
5
6
$ sed '/^:s[0-9]\+/! s#^#<div>#' <<'TEXT'
> :s2 meinText
> meinText
> TEXT
:s2 meinText
<div>meinText

Grafinger

(Themenstarter)

Anmeldungsdatum:
29. April 2020

Beiträge: 8

Danke dir user_unknown. Passt!

rklm: Hmmm, das div-Tag wird bei dir immer davor geschrieben, auch bei ":s2 Text". Liegt das an dem Plus im ersten Ausdruck? Heißt ja bei RegEx: einmal oder mehrmals. Ohne diesem geht es.

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5582

Grafinger schrieb:

rklm: Hmmm, das div-Tag wird bei dir immer davor geschrieben, auch bei ":s2 Text". Liegt das an dem Plus im ersten Ausdruck? Heißt ja bei RegEx: einmal oder mehrmals. Ohne diesem geht es.

Bei mir funktioniert das. Hast du das Backslash vor dem Plus eh nicht vergessen? Ohne Backslash haette ich das von dir beschrieben Verhalten.

Mich wuerde noch interessieren, warum das Plus hier escaped werden muss.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

sebix schrieb:

Grafinger schrieb:

rklm: Hmmm, das div-Tag wird bei dir immer davor geschrieben, auch bei ":s2 Text". Liegt das an dem Plus im ersten Ausdruck? Heißt ja bei RegEx: einmal oder mehrmals. Ohne diesem geht es.

Wir müssten mal die Eingabe und genaue Kommandozeile sehen, die das beschriebene Verhalten erzeugt.

Bei mir funktioniert das. Hast du das Backslash vor dem Plus eh nicht vergessen? Ohne Backslash haette ich das von dir beschrieben Verhalten.

Mich wuerde noch interessieren, warum das Plus hier escaped werden muss.

Weil in der Standard-Syntax von sed-Regex das Plus kein Metazeichen ist wie z.B. [, ] und *. Mit Option -r wird das etwas netter.

Grafinger

(Themenstarter)

Anmeldungsdatum:
29. April 2020

Beiträge: 8

Oh, hoppla. Es funktioniert ja doch. Ich hatte es im Mac-Terminal probiert statt auf Debian/Ubuntu. Der Mac kommt mit BSD-Sed daher, was sich teilweise unterscheidet. Dort geht es dann ohne Maskierung des + und mit dem Parameter -r.

Antworten |