Anzeige:
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 38

Thema: Bin neu hier! Habe Problemm mit "sed"

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Question Bin neu hier! Habe Problemm mit "sed"

    Hi all!

    Ich habe in zwischen gelehrnt wie man mit "find" "ls" "cat" usw. umgeht, aber ich habe immer noch kein Plan wie man mit "cat" umgeht Im internet habe ich keine FAQ auf deutsch gefunden und in englisch bin ich ein 0. Könte mir jemand link geben wo man über das befehl sed mehr erfahren könnte. For allem über filterfunktionen.

    ich muss z. B. aus eine datei test.txt mit dem Inhalt:
    ./datei/datei
    ./datei/datei/irgendwas
    /home/meinuser/tmp/datei/datei
    /home/meinuser/tmp/datei/datei/noch was

    ihalt verändert auf das:
    /datei/datei
    /datei/datei/irgendwas
    /datei/datei
    /datei/datei/noch was

    und noch eine frage:
    wie kann man das : /home/meinuser/tmp/ingendwas-1.8.tar.gz
    so machen das er nur das anzeigt "irgendwas" und 1.8

    danke im voraus!

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    das erste geht mit was in die Richtung:
    Code:
    sed "s/.*Datei/Datei/" <datei.txt
    da wird irgendetwas, auf das "Datei" folgt durch "Datei" ersetzt

    Das zweite
    Code:
    echo /home/meinuser/tmp/ingendwas-1.8.tar.gz | sed "s#.*-\([0-9].*[0-9]\).*#\1#"
    echo /home/meinuser/tmp/ingendwas-1.8.tar.gz | sed "s#.*/\(.*\)-.*#\1#"
    So. Erklärungen nach dem essen.
    [Edit]
    So:
    . in Regulären Ausdrücken heisst irgend ein Zeichen
    * heisst 0 bis n Stück, also beliebig viele.
    Im Ersten wird nach .*- gesucht, also irgendwas auf das ein - folgt. Danach kommen die Klammern, die jeweils mit \ escaped werden müssen - sie dienen der Gruppierung.
    [0-9] heisst irgend eine Zahl, dann ein Zeichen (ein Punkt, der Reg-Ausdruck bedeutet aber irgend ein Zeichen - 1a8 würde also auch gefunden) und wieder eine Zahl. Anschliessend noch irgendwelche Zeichen.
    Nach dem zweiten # steht, durch was der vorher gefundene Text ersetzt werden soll. \1 bedeutet die erste Gruppe von vorher - also alles was von der ersten \( bis zur \) gefunden wurde.

    beim zweiten wird nach irgendwas gesucht, das gefolgt von einem / und wieder gefolgt von irgendwas (gruppe 1), von einem "-" gefolgt wird. Anschliessend kommt wieder irgendwas. Das Ganze wird durch die Gruppe1 ersetzt.

    Wichtig beim Zweiten ist, dass .* "greedy" ist - es möchte möglichst gross sein.
    Das heisst, dass .*/ hier nicht den Pfadanfang bis zum ersten / bezeichnet, sondern alles bis zum letzten /, also so weit wie möglich (d.h. so weit wie möglich, bei dem der Rest immer noch matcht, also nachher irgendwelche Zeichen, gefolgt von einem - kommen)
    [/Edit]

    Deutsches Tutorial kenne ich keines - nur englische.
    Für den Anfang noch Hilfreich kann ein Regexp-Generator sein - etwa txt2regex

    MfG Peschmä
    Geändert von peschmae (05-06-2004 um 17:29 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Thumbs up Danke!

    Danke vielmals! endlich eine FAQ die ich auch verstehe!

    wie gut das es immer noch menschen gibt wie peschmae!

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Wenn du in der Datei den führenden Punkt löschen magst, dann kannst du das auch schnell mal im vi bzw. vim (unter X - der graphischen Oberfläche) machen.

    Und zwar so:

    PHP-Code:
    vi datei            # klar, das öffnet die Datei im Editor vi
    :1,$ s/^.//       # : öffnet den Befehlsmodus,
                           # 1,$ bedeutet von der 1. bis zur letzten Zeile der Datei
                           # s/^.// bedeutet lösche (englisch substitute) den Punkt  
                           # am Zeilenanfang (^.) und ersetze ihn durch nichts 
    :x                    # speichere die Änderungen und verlasse vi 
    Wenn zwischen den beiden // etwas gestanden hätte, hätte er die/das Zeichen anstelle des Punkts geschrieben.

    Du siehst - man muß nicht immer sed benutzen, um mal eben eine Datei zu bearbeiten

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    :1,$ s/^.//
    Ich schreibe dafür meistens :%s/^.//
    3 Zeichen weniger

    Gruss, Andy

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    ok, es geht in diesem Fall aber noch kürzer:
    Code:
    :%s/.

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    gewonnen

  8. #8
    Registrierter Benutzer
    Registriert seit
    30.12.2002
    Ort
    Tübingen
    Beiträge
    20
    Hi
    Ich erlaube mir mal mich mit einem ganz ähnlichen Problem hinten dran zu hängen.
    Ich schreibe ebuilds für Gentoo, in diesem Fall betrifft es den ebuild app-sci/pgcalc2
    Die source.tar.gz sind z.B. so versioniert:
    Code:
    pgcalc2-2.2-4.tar.gz
    Würde ich diese Versionierung auch im ebuild verwenden, würde dies aber bedeuten, dass es Version "4" ist, da immer die Zahl(en) nach dem letzten Strich als Version gewertet werden, die richtige Version ist in diesem Falle also "2.2.4".

    Bisher bin ich immer folgendermaßen vorgegangen:
    Code:
    MY_PV="${PV/.4/-4}"
    Ich will hier jetzt aber eine regexp einsetzen, um immer das Muster "PunktLetzteZahl" durch das Muster "StrichLetzteZahl" zu ersetzen. Somit muss man beim Erscheinen einer neuen Version nicht immer die Variable erneut ändern, sondern nur den ebuild umbenennen.

    Also hab ich mich mal auf die Suche in diversen regexp Tutorials gemacht und hab mir folgendes zusammengebaut:
    Code:
    MY_PV=${PV/$\.[0-9]/$-[0-9]}
    Leider scheint das Konstrukt nicht zu funktionieren.
    Weiß jemand, wie dem beizukommen ist?

    Grüße

    Elias P.

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    mit Sed:

    Code:
    MY_PV=$(echo $PV | sed "s#\(.*\)-\([0-9].tar.gz\)#\1\.\2#")
    das andere Zeugs beherrsche ich allerdings nicht. Ich benutze hier wieder die Buffer zum Speichern von Zeugs zwischen () - das gibts offenbar nur bei Sed.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  10. #10
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Unhappy Noch ein Problem

    ich bin allen dankbar für die snelle antworten aber ich habe noch ein problem:

    Ich muss aus eine Datei wo alle Informationen in mehreren Zeilen stehen
    wie kann ich die Zeilen zusammenfügen
    damit alles in eine zeile steht?

    z. B.
    /ordner/ordner
    datei
    /ordner/ordner

    zu

    /ordner/ordner datei /ordner/ordner

  11. #11
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    Code:
    for i in `cat install`; do h="$h$i"; done
    so werden alle zeilen der Datei zu einer.

    steve
    pornstars-online.de

  12. #12
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Unhappy ???

    Endwider habe ich das nicht ganz kopiert oder das ist nicht das was ich wollte

    Hier ist das was raus kamm:
    [chapaev@chapaev tmp]$ cat test1 h="$h"
    /test/test
    /test/test1
    /test/test2
    /test/test3
    /test/test1
    /test/test2
    /test/test3
    /test/test4
    /home/chapaev/tmp
    start
    tset2
    tset2
    tset2
    tset2
    stop
    cat: h=/test/test/test/test1/test/test2/test/test3/test/test1/test/test2/test/test3/test/test4/home/chapaev/tmp/test/test/test/test1/test/test2/test/test3/test/test1/test/test2/test/test3/test/test4/home/chapaev/tmpstarttset2tset2tset2tset2stop: No such file or directory

    ich wollte das die zeilen in eine zeile stehen aber das da jedoch lehrzeichen bleibt.

  13. #13
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    dann tust du dort noch ein Leerzeichen rein

    Code:
    for i in `cat install`; do h="$h $i"; done
    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  14. #14
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Jetztz habe ich es geschnalt!

    Danke noch mal!

    Noch eine Frage bevor ich gehe. Gibt es eigendlich ein extra zeichen für die unmschaltung von Zeilen?

    damit ich z. B. eingeben kann # echo irgend ein text $zeichen_für_die_nechste_zeile und weiteres text!


    MfG
    Chapaev

  15. #15
    Registrierter Benutzer
    Registriert seit
    07.06.2004
    Ort
    Stammheim
    Beiträge
    43
    Wenn du echo benutzt, kannst du "\n" verwenden:

    echo "1. Zeile\n2. Zeile"

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •