Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Wie bringe ich sed bei, ob es den ersten oder letzten vorkommenden Char nimmt?

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74

    Wie bringe ich sed bei, ob es den ersten oder letzten vorkommenden Char nimmt?

    Hallo zusammen,

    ich möchte mal bis zum ersten Vorkommen eines Zeichen und mal bis zum letzen sedden können. Beispiel:

    Letztes Vorkommen:
    Code:
    $ echo "mein/pfad/zur/Datei/filename"|sed -e "s#.*/#+++#"
    +++filename
    Aber wie geht das erste Vorkommen?
    Code:
    $ echo "mein/pfad/zur/Datei/filename"|sed -e "s#??????#+++#"
    +++pfad/zur/Datei/filename
    Ich suche nach "/" und will mal bis zum ersten und mal bis zum letzen zusammenfassen. Erweitert könnte noch die Frage stehen, wie ich bis zum x-ten Vorkommen zusammenfasse? Geht das auch?

    Ich weiß, daß ich das X-te Vorkommen ersetzen kann, z.B. nur den Part "zur/", jedoch das Übergreifende fehlt mir vom Wissen her...

    Neugierige Grüße, Florian

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74
    Dazu keiner was?

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Das geht z. B. so...
    Code:
    echo "mein/pfad/zur/Datei/filename"|sed -e "s#[^/]*/#+++#"
    In den [ ] definierst Du eine Zeichenklasse. Durch das ^ direkt hinter der öffnenden [ invertierst Du diese Zeichenklasse. Sie beinhaltet nun alle Zeichen - außer '/'.
    Der Quantifier * erlaubt eine beliebige Anzahl an Vorkommen...

    Dieser Ausdruck passt so auf alles, was vor dem ersten / kommt...

    hth, michael

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118
    Eigentlich geht dies trivial mit einem nichtgierigen Quantifizierer.

    Der Ausdruck
    Code:
    .*/
    ist gierig und findet so das letzte Vorkommen des Slash. Der Ausdruck
    Code:
    .*?/
    ist genügsamer und macht damit den ersten Slash im String.

  5. #5
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74
    Zitat Zitat von Thomas Engelke Beitrag anzeigen
    Eigentlich geht dies trivial mit einem nichtgierigen Quantifizierer.

    Der Ausdruck
    Code:
    .*/
    ist gierig und findet so das letzte Vorkommen des Slash. Der Ausdruck
    Code:
    .*?/
    ist genügsamer und macht damit den ersten Slash im String.
    Das scheint so nicht zu klappen:
    Code:
    $ echo "[Der] Fuchs springt - jetzt[oder?]jetzt"|sed -e "s/\].*?jetzt\[/ /"
    [Der] Fuchs springt - jetzt[oder?]jetzt
    Erwartet hätte ich jetzt:
    Code:
    [Der oder?]jetzt
    Geändert von qeldroma (14-02-2007 um 16:35 Uhr)

  6. #6
    intooblivion
    Gast
    hallihallo,

    ich möchte etwas ähnliches machen, und zwar einen Dateinamen vom Anfang bis zu einem Leerzeichen abschneiden, dahinter ein '\' einfügen und dann den Rest des Strings wieder anfügen. Ist dies mit sed möglich?

    mfg

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    @queldroma: Damit der Quantifier tut, was Du willst, musst Du ihn escapen:

    Code:
    echo "[Der] Fuchs springt - jetzt[oder?]jetzt"|sed -e  "s/\].*\?jetzt\[/ /"
    @intoooblivion:
    Code:
    sed -e 's# #\\ #g'
    ersetzt alle Leerzeichen gegen '\ '...

  8. #8
    intooblivion
    Gast
    Hi danke,

    ich hatte es auch gerade auf der englischen Wikipedia gesehen, sorry.

    Eine Frage bleibt bei mir noch, nun angenommen ich habe
    DATEI="1st_and_ 2nd_term"
    und sage jetzt
    filename=`echo $DATEI | sed 's/ \+/\\ /g'`

    wieso sind meine Änderungen jetzt nicht in der neuen Variablen?

    Sorry, ich bin nicht so der Profi in Shellskript, vielleicht liegt der Fehler auf der Hand...

    mfg.

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Es kommt ein wenig drauf an, was danach mit dem String passiert...

    Probier mal, ob folgendes bei Dir geht:
    Code:
    filename=`echo $DATEI | sed 's/ \+/\\\\ /g'`
    Damit maskierst Du den Backslash auch noch... vier '\' werden zu zwei '\' und beim weiterverarbeiten werden zwei '\' zu einem - bleibt '\ ' übrig....

  10. #10
    intooblivion
    Gast
    ach herrje ich guck schon viel zu lange drauf, vielen vielen dank!

  11. #11
    intooblivion
    Gast
    Hi..

    ich sollte meine Fragen zusammenfassen - ich weiß, ich bitte es zu entschuldigen... Ok, mein Skript ist komplett fertig, leider muss ich in dem Skript in ein Verzeichnis mit Leerzeichen wechseln, per sed habe ich es in eine Form gebracht, daß die Shell es schlucken müsste, tut sie aber natürlich nicht.

    es sieht so aus:

    nenpfad="/home/1st_and_ 2nd_term"
    dateiname=`echo $nenpfad | sed 's/ \+/\\\\ /g'`
    echo $dateiname
    echo `ls -l $dateiname`

    der dateiname auf den ich zugreifen will wird auch korrekt angezeigt, nur das ls -l macht mucken, "Directory not found"... Es greift wohl erst auf den ersten teil bist zum Leerzeichen zu und dann auf den zweiten teil...

    hättet ihr vielleicht eine Idee?

    EDIT: Mein Fehler, Beitrag kann gelöscht werden. Entschuldigung.
    Geändert von intooblivion (14-02-2007 um 22:43 Uhr)

  12. #12
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Ort
    Boeblingen
    Beiträge
    90
    echo `ls -l "$dateiname"`

    ?
    Servus und bis bald,

    Blackhawk

Lesezeichen

Berechtigungen

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