Bash: Regular Expressions

Hallo,

ich möchte in einem Bash-Only-Script (also kein sed!) über eine RE auf eine Kommentarzeile der Form

[|\t]\*#+

testen.
Ein gültiger Kommentar liegt also dann vor, wenn das erste Nicht-Whitespace-Zeichen die Raute ist.
Ich hab’s stundenlang erfolglos nach dem Advanced-Bash-Scripting-Howto mit expr versucht.
Also beispielsweise mit :

comment=`expr match $line [|\t]*#`

Alle Varianten schlugen fehl.
Wie zum Geier kriegt man das hin?
Wer-weiss-Rat?

Gruß
Andreas

Hallo Andreas

ich hab’s grade mit dem RE ^[|/t]*# (das ^ steht für den Anfang einer Zeile) ausprobiert. Das Ergebnis bei mir scheint OK zu sein.

Grüße
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Martin,

ich hab’s grade mit dem RE ^[|/t]*# (das ^ steht für den
Anfang einer Zeile) ausprobiert.

Die RE an sich ist mir schon klar.
Nur nimmt „expr“ das nicht.
Ich hab jetzt mal Deinen Ausdruck verwendet:

comment=`expr match $line ^[|/t]*#`

und bekomme u.a.:

expr: warning: unportable BRE: `^[': using `^' as the first character of the basic regular expression is not portable; it is being ignored

oder

expr: Unmatched [ or [^

Aber die Syntax ist doch so okay

Beispiel aus Adv.-Bash-Script.-Howto:

# 'match' operations similarly to 'grep'
b=`expr match $a [0-9]*`
echo Number of digits at the beginning of $a is $b.

Verzweifelt…
Andreas

Ich hab’s stundenlang erfolglos nach dem
Advanced-Bash-Scripting-Howto mit expr versucht.
Also beispielsweise mit :

comment=expr match $line [ |\t]\*#

Hallo Andreas

Aber die Syntax ist doch so okay

Beispiel aus Adv.-Bash-Script.-Howto:

‚match‘ operations similarly to ‚grep‘

b=expr match $a [0-9]*
echo Number of digits at the beginning of $a is $b.

Hm, bei mir sieht das Beispiel im ABSG so aus:

b=`expr match "$a" '[0-9]*'`
echo Number of digits at the beginning of \"$a\" is $b.

Da wurde also noch der RE gequotet. Wenn da 'ne Fehlermeldung von der Shell kommt, dann möchte diese den RE interpretieren, was sie aber nicht soll, also quoten.

Grüße
Martin

Hallo schon wieder,

Hm, bei mir sieht das Beispiel im ABSG so aus:

b=expr match "$a" '[0-9]\*'
echo Number of digits at the beginning of „$a“ is $b.

Da wurde also noch der RE gequotet. Wenn da 'ne Fehlermeldung
von der Shell kommt, dann möchte diese den RE interpretieren,
was sie aber nicht soll, also quoten.

Yo…
Hört sich logisch an.
Nur bringt ein

comment=`expr match "$line" '^[|\t]*#'`

expr: warning: unportable BRE: ^[|\t]*#': using ^’ as the first character of the basic regular expression is not portable; it is being ignored

Wo bekomme ich denn Dokus her für die „basic regular expressions“. Wieso darf ich das Caret dort nicht als erstes Zeichen nutzen?

Gruß und Danke
Andreas

Hi,

ich möchte in einem Bash-Only-Script (also kein sed!) über
eine RE auf eine Kommentarzeile der Form

[
|\t]*#+

testen.

ich kann Dir zwar leider bei Deinem eigentlichen Problem nicht helfen; aber wenn Du es geschafft hast, teste doch mal die Zeile

|||#

damit :smile:

In eckigen Klammern steht eine Zeichenklasse, d.h. es wird gematcht, wenn eines der enthaltenen Zeichen vorkommt - inkl. „|“. Whitespaces sind übrigens in der Zeichenklasse \s gesammelt. Zudem wird ohne führendes „^“ mitten in der Zeile gesucht, nicht am Anfang. Die richtige RegExp wäre also:

^\s*#

Ein „+“ dahinter ist ebenfalls nicht nötig, Dir reicht ja bereits eine einzelne Raute.

Cheatah

Hallo,

Whitespaces sind übrigens in der Zeichenklasse \s
gesammelt. Zudem wird ohne führendes „^“ mitten in der Zeile
gesucht, nicht am Anfang. Die richtige RegExp wäre also:

^\s*#

Oh yo…
Gut zu wissen.
Danke.
Aber leider spuckt mich die Bash immer noch an:

expr: warning: unportable BRE:
`^\s*#': using `^' as the first character of the basic regular expression
is not portable; it is being ignored

Häh?

Grüße
Andreas

Hallo Andreas

neuer Versuch.

Ich habe grade mal ein bisschen mit deiner Syntax rumprobiert.

Aber leider spuckt mich die Bash immer noch an:

expr: warning: unportable BRE:

^\s*#': using ^’ as the first character of the basic

regular expression

is not portable; it is being ignored

Diese Fehlermeldung kam bei mir auch. Nachdem ich das ^ duruch einen \ vor der Bash versteckt habe, also ^\s*# (comment=expr match "$line" '\^\s*#')gab’s keine Fehlermeldung mehr. Ich kann natürlich nicht dafür garantieren, dass das Ergebnis richtig ist. Ein Test mit

grep ^\s*# /etc/rc.config > test1.txt

grep ^\s*# /etc/rc.config > test2.txt

diff test1.txt test2.txt

sagte mir, dass die Ergebnisse gleich sind.

Grüße

Martin

Aufgabe
Hallo,

ich hab’s jetzt aufgegeben mit den „basic regular expressions“ zu arbeiten und nehme jetzt sed (Des Teufels kleiner Helfer)

Danke an alle für die Hinweise

Gruß
Andreas