[sed:] Ersetzen mit newline

Dieses Thema im Forum "Mac OS X - Unix & Terminal" wurde erstellt von maceis, 28.11.2005.

  1. maceis

    maceis Thread Starter MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    hallo zusammen,

    ich habe eine Frage zu sed.

    Das hier funktioniert:
    Code:
    #echo "jedes wort in einer zeile" | sed -e 'y/ /\n/'
    jedes
    wort
    in
    einer
    zeile
    Das nicht:
    Code:
    echo "jedes wort in einer zeile" | sed -e 's/ /\n/g'
    jedesnwortninneinernzeile
    Warum nicht?
    Wie erreiche ich mit "s/ /\n/g" das selbe Ergebnis wie mit "y/ /\n/"?

    Ich habe gelesen, dass mit manchen sed Versionen die /s Variante auch "funktioniert".
    Unter Mac OS X und FreeBSD habe ich es aber nicht geschafft.

    Danke im voraus.
     
  2. maceis

    maceis Thread Starter MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Okay, gelöst.
    So geht es:
    Code:
    % echo "Jedes einzelne Wort eine Zeile" | sed  's/ /\       
    /g'
    Jedes
    einzelne
    Wort
    eine
    Zeile
    Aber leider geht das nicht, obwohl es laut manpage (s. "man sed | less +107") gehen müsste:
    Code:
    % echo "Alles                                                
    in
    einer
    Zeile" | sed 's/\n/ /g'
    Alles 
    in
    einer
    Zeile
    Vorschläge?
    Lösungen?
     
  3. chen

    chen MacUser Mitglied

    Beiträge:
    390
    Zustimmungen:
    2
    MacUser seit:
    03.11.2005
    Probiere es mal mit der Syntax:

    echo "hallo" | sed -e 's,hallo,holla,'
     
  4. chen

    chen MacUser Mitglied

    Beiträge:
    390
    Zustimmungen:
    2
    MacUser seit:
    03.11.2005
    Oh, sehe gerade, dass es evtl. daran liegt:

    man sed:

    2. The escape sequence \n matches a newline character embedded in the
    pattern space. You can't, however, use a literal newline character
    in an address or in the substitute command.
     
  5. maceis

    maceis Thread Starter MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Das habe ich auch gelesen.
    Eigentlich steht da doch, dass es klappen müsste.
    Ich habe im pattern space die escape sequence angegeben \n und erwarte, dass es auf newline characters matched.
    Ich probier gerade mit Puffern herum. Ich glaub damit bekommt man es hin.

    Das -e ist übrigens redundant, wenn nur ein Kommando ausgeführt wird.
     
  6. chen

    chen MacUser Mitglied

    Beiträge:
    390
    Zustimmungen:
    2
    MacUser seit:
    03.11.2005
  7. maceis

    maceis Thread Starter MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Mit \n kann man nicht ersetzen, aber mit "wörtlichen Zeilenumbrüchen" s.o.

    In Deinem Link steht, wie man einzelne \n ersetzen kann.
    Wenn man mehrere \n ersetzen möchte wird es komplizierter, geht aber auch, z.B. so:
    Code:
    echo "Alles
    auf
    einer
    Zeile" |\
    sed -n 'H;$blable
    d;:lable
    g;s/\n/ /g;p'
    
     
  8. chen

    chen MacUser Mitglied

    Beiträge:
    390
    Zustimmungen:
    2
    MacUser seit:
    03.11.2005
    Okay, es ist wohl ein Bug in OSX?

    Auf Gentoo z.B.:

    echo "jedes wort in eine zeile" |sed -e 's/ / \n/g'
    jedes
    wort
    in
    eine
    zeile

    funktioniert es tadellos, doch nicht auf OSX.
     
  9. uselessuser

    uselessuser MacUser Mitglied

    Beiträge:
    422
    Zustimmungen:
    24
    MacUser seit:
    11.09.2005
    sed am Mac ist eine Qual, wenn man vorher mit dem sed gearbeitet hat, das etwa bei Ubuntu dabei ist. gsed ist nicht viel besser; ich bin der Einfachkeit halber auf Perl umgestiegen. Da ist wenigstens alles "genormt" und Newlines kann man auch ohne Probleme matchen.

    Derjenige, der herausfindet, wie man am Mac mit sed mehrere Newlines zu einer einzigen eliminiert bekommt... hm, sagen wir, der ist klug.
     
  10. chen

    chen MacUser Mitglied

    Beiträge:
    390
    Zustimmungen:
    2
    MacUser seit:
    03.11.2005
    @uselessuser

    installiere und compiliere gnu sed und dann verfahre wie unter linux :)
     
Die Seite wird geladen...

Diese Seite empfehlen