Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich muss vorausschicken, dass ich so gut wie überhaupt keine Ahnung von Skripten habe, vielleicht kann mir ja jemand einen guten Tipp geben, wie ich das anständig lernen könnte :-)

Jetzt zu meiner Frage, kann mir jemand erklären, was diese Zeile heißt/bedeutet?

"sed -n -e 's/^mailto[ <tab>][ <tab>]*\([^ <tab>]*\)[ <tab>.*$/\1/p' -e 's/...'

Wie sich das zusammensetzt und was es einzeln bedeutet?

Wäre echt prima, wenn mir da jemand weiterhelfen könnte

Viele Grüße

Geschrieben

"sed -n -e 's/^mailto[ <tab>][ <tab>]*\([^ <tab>]*\)[ <tab>.*$/\1/p' -e 's/...'

Wie sich das zusammensetzt und was es einzeln bedeutet?

Wäre echt prima, wenn mir da jemand weiterhelfen könnte

sed ist der stream editor. Er nimmt einen Datenstrom und kann diesen Bearbeiten. In diesem Fall ist der Ausdruck in der Form 's/REGEX/REPLACE/p', das ist eine substitution. Es wird nach REGEX gesucht und das ganze mit \1 (ein Backref) ersetzt. Durch -n und dem p am Ende werden nur die gefundenen und ersetzten Ausdrücke als Ausgabe verwendet, alles andere wird verworfen.

Das Thema RegExp ist zu Umfangreich um es hier ausführlich zu behandeln :)

Vielleicht hilft folgendes Beispiel:


# cat sample.txt

Dies ist ein kleiner Beispieltext.

Er hat zwei Zeilen mit Punkt am Ende.

Aber er hat auch Zeilen ohne Punkt,

darauf matcht der RegExp leider nicht!

# cat sample.txt | sed -n -e 's/^.* \([a-zA-Z]\+\)\.$/\1/p'

Beispieltext

Ende

Der reguläre Ausdruck ^.* \([a-zA-Z]\+\).$ passt auf Zeilen die mit irgendwas Anfangen, aber mit einem Leerzeichen, mindestens einem Buchstaben und einem Punkt enden. Alles zwischen Leerzeichen und Punkt wird referenziert (durch die runden Klammern). Dieser Zeile wird ersetzt durch die Referenz, also das letzte Wort der Zeile.

Siehe man -s7 regex oder man google sich durch :)

^.* \([a-zA-Z]\+\).$ in Kürze:

^ steht für einen Zeilenanfang

.* steht für ein beliebiges Zeichen (.) beliebig oft (*)

\(...\) erzeugt eine Referenz

[a-zA-Z]\+ ist die Gruppe der Buchstaben a-z und A-Z (eckige Klammer), es muss ein Element oder mehr vorhanden sein (\+)

\. ist ein Punkt (da . ein beliebiges Zeichen ist)

$ steht für das Zeilenende

Geschrieben

Hallo,

danke für die erste Info.

Könntet ihr mir vielleicht noch etwas weiterhelfen?

Mein mailto funktioniert nicht, der liest nichts aus, oder besser besagt er findet mit meinem Befehl nichts.

RCPT="`sed -n -e 's/^mailto[ ][ ]*\ ([^ ]*\)[ ].*$/\1/p' $CONFIGFILE`"

Wo ist der Fehler? Hab ich eine Klammer zuviel oder zuwenig? Bitte, bitte, ich brauch dringend HILFE!!

Geschrieben

RCPT="`sed -n -e 's/^mailto[ ][ ]*\ ([^ ]*\)[ ].*$/\1/p' $CONFIGFILE`"

Du hast die hinter Klamme escaped ("\)") die vordere jedoch nicht. sed sollte sich beschweren.


sh -x testsed.sh

++ sed -n -e 's/^mailto[ ][ ]*\ ([^ ]*\)[ ].*$/\1/p'

sed: -e expression #1, char 37: Unmatched ) or \)

Die Frage ist auch was du eigentlich Filtern willst. Die [ ] Ausdrücke mit vielen Leerzeichen machen keinen Sinn für mich.

Geschrieben

Hallo,

die [][] stehen für die Leer und Tabzeichen in der config-Datei. In der config-Datei sind die werte durch Leerzeichen oder Tab getrennt. Ich hab in der config-Datei ein mailto definiert, an das eine Mail geschickt werden soll.

Blöde Frage, welche hintere Klammer meinst du? Ich weiß jetzt ehrlich gesagt nicht, wo ich was ändern soll? :-)

Geschrieben

In


s/^mailto[ ][ ]*\ ([^ ]*\)[ ].*$/\1/p

                  ^     ^^

Die Klammer ( steht allein, die Klammer \) ist korrekt escaped. Tabs werden übrigens als \t geschrieben. Wenn du in der config also sowas hast wie mailto (spaces, tabs) user@example.com (spaces,tabs) Dann ist der korrekte Ausdruck für sed

s/^mailto[ \t]*\([^ \t]*\)[ \t]*$/\1/p

Im Detail:

^ - Zeilenanfang

mailto - mailto

[ \t]* - ein oder mehr Zeichen aus der Gruppe Leerzeichen und Tabs

\( - Backreferenz start

[^ \t]* - ein oder mehr Zeichen die nicht aus der Gruppe Leerzeichen und Tabs sind

\) - Backreferenz ende

[ \t]* - ein oder mehr Zeichen aus der Gruppe Leerzeichen und Tabs

$ - Zeilenende

Geschrieben

Super, es funktioniert :-)

Darf ich dich noch was fragen?

Ich hab jetzt erst das erstemal mit Scriptschreiben zutun und wirklich viel Ahnung hab ich bis jetzt noch nicht. Wie lernt man das am Besten? Hättest du da einen Tipp?

Meine zweites Anliegen wäre, eine weitere Abfrage.

get_df_info()

{

df -lk | sed -n -e 's/[ ][ ]*/ /g' -e 1p -e '/^\/dev\//p' | cut -d ' ' -f1,5,6 | tr -d '%'| while read p1 p2 p3; do echo df:"$p1 $p2 $p3"; MAX=$DEFAULTCAP

for j in $CONF; do

PARTITION=`echo $j | cut -d ' ' -f1`

if [ "$p3" = "$PARTITION" ]; then

MAX=`echo $j | cut -d ' ' -f2`

fi

done

if [ $p2 -gt $MAX ]; then

echo Device: $p1 Capacity: $p2 Mountpoint: $p3

fi

done

}

Jetzt soll in die for-Schleife soetwas wie das rein OIFS=$IFS; IFS="|"; set $LINE; IFS=$OIFS;

Wo bring ich das unter und wie ruf ich dann die einzelnen Variablen auf?

Für euch hört sich das vielleicht leicht an, aber für mich ist das für den Einstieg schon nicht gerade leicht :-(

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...