unixnix Geschrieben 7. Mai 2009 Geschrieben 7. Mai 2009 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
DevilDawn Geschrieben 7. Mai 2009 Geschrieben 7. Mai 2009 "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
unixnix Geschrieben 8. Mai 2009 Autor Geschrieben 8. Mai 2009 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!!
DevilDawn Geschrieben 8. Mai 2009 Geschrieben 8. Mai 2009 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.
unixnix Geschrieben 8. Mai 2009 Autor Geschrieben 8. Mai 2009 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? :-)
DevilDawn Geschrieben 8. Mai 2009 Geschrieben 8. Mai 2009 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
unixnix Geschrieben 8. Mai 2009 Autor Geschrieben 8. Mai 2009 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 :-(
unixnix Geschrieben 8. Mai 2009 Autor Geschrieben 8. Mai 2009 Hallo zusammen, hab den Fehler/Lösung selbst gefunden. Besten Dank für euere Hilfe
bloodknight Geschrieben 11. Mai 2009 Geschrieben 11. Mai 2009 Hi, kleiner Nachtrag: Mir hat der ABS-Guide immer prima geholfen! ciao bloodknight
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden