Problem mit sed (newline am Ende)

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Viperb0y, 13.02.2007.

  1. #1 Viperb0y, 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    ich habe ein Problem mit sed:

    Ich verwende folgendes Script:
    Code:
    sed -n '/^[^#|^ ].*/p' /k/_builder/versions.conf > /k/_builder/versions.conf.tmp
    um kommentare und leerzeilen aus einer Konfigurationsdatei zu löschen. Allerdings hängt mir sed am Ende der geschriebenen Datei wieder eine leerzeile an. Kann man das ausschalten? Weil genau diese leerzeile stört mich :(.

    Geht das überhaupt? Ich hoffe mal :(
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 blueshark, 13.02.2007
    blueshark

    blueshark Doppel-As

    Dabei seit:
    09.02.2007
    Beiträge:
    107
    Zustimmungen:
    0
    Ort:
    Bremen
    Ich denke, dass sed keine Zeile einfügt, sondern einfach durch eine leere Zeile ersetzt. Nutze anstelle des Substitutionskommandos 'p' das Zeilenlöschkomando 'd'.
     
  4. #3 Viperb0y, 13.02.2007
    Zuletzt bearbeitet: 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    hm, er fügt doch keine leere Zeile an. In der Quelldatei war noch eine leer Zeile am Ende der Datei, mein Fehler.

    Aber gibts eine möglichkeit auch die leere Zeile am ende der Datei zu löschen? Weil aktuell löscht er ja leer zeilen, nur nicht die am Ende o.O

    Hier nochmal der Befehlscode:
    Code:
    sed -n '/^[^#|^\n].*/p' /k/_builder/versions.conf > /k/_builder/versions.conf.tmp
    Das Ursprungsfile:
    Code:
    # Testkommentar
    0 netcologne rel-3-1-26-0 3030 3031 3032
    
    0 emds rel-3-1-26-0 3033 3034 3035
    0 emds rel-3-1-25-0 4000 4001 4002
    
    Das Endfile:
    Code:
    0 netcologne rel-3-1-26-0 3030 3031 3032
    0 emds rel-3-1-26-0 3033 3034 3035
    0 emds rel-3-1-25-0 4000 4001 4002
    0 infodesire curr 4003 4004 400
    
    :-/ Der will mir die letzte Zeile nicht löschen :(

    EDIT: P.S. Ich komme auch aus Mainz ;)
     
  5. #4 blueshark, 13.02.2007
    blueshark

    blueshark Doppel-As

    Dabei seit:
    09.02.2007
    Beiträge:
    107
    Zustimmungen:
    0
    Ort:
    Bremen
    Gefühlsmäsßig würde ich das so machen (hab's aber nicht getestet)
    Code:
    sed -n '/^[#|\n| ]/d' ...
    Im Moment weiß ich noch nicht, warum du zweimal ein ^ verwendest.
     
  6. #5 Viperb0y, 13.02.2007
    Zuletzt bearbeitet: 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    Code:
    sed -n '/^[#|\n| ]/d' /k/_builder/versions.conf > /k/_builder/versions.conf.tmp
    Ergibt garnichts :) Einfach ne leere Datei :)

    Das ^ verwende ich dafür damit nur die zeilen mit mit \n oder # anfangen beachtet werden, da ja jede zeile am ende ein \n hat ;) Ohne gehts nicht :)

    EDIT:
    Code:
    sed '/^[#|\n| ]/d' /k/_builder/versions.conf > /k/_builder/versions.conf.tmp
    Ergibt folgende ausgabe:

    Code:
    0 netcologne rel-3-1-26-0 3030 3031 3032
    
    0 emds rel-3-1-26-0 3033 3034 3035
    0 emds rel-3-1-25-0 4000 4001 4002
    
     
  7. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Hallo
    Versuchs mal damit:
    Code:
    sed '/^[#|\n]/d;/^$/d' /file/foo > /file/bar
    
    Gruss
    d22
     
  8. #7 Wolfgang, 13.02.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Deine Leerzeile wird deshalb ausgegeben, weil sie auf deine Regexp matcht.
    Eine von vielen Lösungen für GNU sed:
    Code:
    
    wolle@Nietzsche:~/temp
    $ cat testdatei
     foo bar
     foo bar baz
     #comment
     # more comment
     vorletzte Zeile
    
    
    wolle@Nietzsche:~/temp
    $ sed -ne '/^[^#]*$/{/^$/!p}' testdatei
     foo bar
     foo bar baz
     vorletzte Zeile
    wolle@Nietzsche:~/temp
    
    Gruß Wolfgang
     
  9. #8 blueshark, 13.02.2007
    blueshark

    blueshark Doppel-As

    Dabei seit:
    09.02.2007
    Beiträge:
    107
    Zustimmungen:
    0
    Ort:
    Bremen
    Natürlich, eben war ich ganz irr.
    Jetzt habe ich auch die Dinge mal gestetet. Ist merkwürdig. Auch die Docs, die ich gerade lese, sind hierbei etwas verwirrend.
     
  10. #9 Viperb0y, 13.02.2007
    Zuletzt bearbeitet: 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    vielen dank erstmal für die viele Hilfe, glaube ich hab das Problem falsch beschrieben, sorry :(:

    Wenn ich `cat versions.conf` mache soll statt:
    Code:
    viper@pylon ~ $ cat versions.conf
    0 netcologne rel-3-1-26-0 3030 3031 3032
    0 emds rel-3-1-26-0 3033 3034 3035
    0 emds rel-3-1-25-0 4000 4001 4002
    viper@pylon ~ $ 
    dies:

    Code:
    viper@pylon ~ $ cat versions.conf
    0 netcologne rel-3-1-26-0 3030 3031 3032
    0 emds rel-3-1-26-0 3033 3034 3035
    0 emds rel-3-1-25-0 4000 4001 4002viper@pylon ~ $ 
    kommen.

    Problem ist halt dabei dass auf diese versions.conf Linux und Wintendo Rechner im Netzwerk drauf zugreifen und diese entweder mit oder ohne newline am Ende der Datei speichern. Dies würde ich halt vorher schon filtern. Das mit den # und \n irgendwo in der Datei funktioniert jetzt wunderbar. Nur halt der Rest nicht.

    EDIT:

    Gerade gelesen im sed faq gelesen:
    http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt
    Code:
    5.10. Why can't I match or delete a newline using the \n escape sequence?
          Why can't I match 2 or more lines using \n?
    
       The \n will never match the newline at the end-of-line because the
       newline is always stripped off before the line is placed into the
       pattern space.
    Scheint so als ob es garnicht gehen würde, gibts evtl. eine andere Methode dafür?
     
  11. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Ja, hab gerade folgendes gefunden:
    von: http://www.cs.uu.nl/wais/html/na-dir/editor-faq/sed.html

    Gruss
    d22
     
  12. #11 Viperb0y, 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    ausser mit tr bekomm ich die letzte newline aber nicht weg :( Nur tr löscht mir dann alle newlines :D.

    Ich glaub ich verzweifele :hilfe2:

    Eigentlich kann es doch garnicht so schwer sein dass diese "obligatorische newline" am ende der datei nicht geschrieben wird :-/.
     
  13. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Ich weiss es ist furchtbar umständlich, aber es klappt mal fürs Erste:
    Code:
    line=$(tail -1 FILE) && sed -i '$d' FILE && echo $line | tr -d '\n' >> FILE
    
    Geht bestimmt auch einfacher....
    Bin gespannt was die 'echten Könner' so vorschlagen ;).

    Gruss
    d22
     
  14. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Dumme Frage: handelt es sich um unter MS Windows erstellte Texte?
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Viperb0y, 13.02.2007
    Zuletzt bearbeitet: 13.02.2007
    Viperb0y

    Viperb0y Jungspund

    Dabei seit:
    13.02.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo,

    klappt! Dankeschön :) Endlich ist der Nervenkitzel weg :D

    EDIT: Teils. Die Datei wird manchmal mit Wintendo bearbeitet und manchmal mit Linux. Jetzt klappt es aber
     
  17. #15 Wolfgang, 13.02.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Mit sed alleine fällt mir dazu auch nix besseres ein.
    Der Patternspace hält ja immer einen trailing slash.

    Aber etwas simpler geht das mit dd, wenn die f-size bekannt ist.
    Code:
    $ cat dummy
    Das ist meine Schreibmaschine
    Die Zweite Zeile.
    Ende
    wolle@Nietzsche:~/temp
    $ Z=$(wc -c dummy)
    53 
    wolle@Nietzsche:~/temp
    $ dd if=dummy of=dummy1 bs=1 count=52
    52+0 Datensätze ein
    52+0 Datensätze aus
    52 Bytes (52 B) kopiert, 0,00031157 Sekunden, 167 kB/s
    wolle@Nietzsche:~/temp
    $ cat dummy1
    Das ist meine Schreibmaschine
    Die Zweite Zeile.
    Endewolle@Nietzsche:~/temp
    
    
    Verallgemeinert könnte man nun in der Bash die Bytegröße mit e.g. wc ermitteln und diese um ein Byte reduziert an dd verfüttern.

    Code:
    $ Z=($(wc -c dummy)); 
    echo $Z
    53
    dd if=dummy of=dummy1 bs=1 count=$((Z -1))
    52+0 Datensätze ein
    52+0 Datensätze aus
    52 Bytes (52 B) kopiert, 0,00025128 Sekunden, 207 kB/s
    
    Gruß Wolfgang
     
Thema:

Problem mit sed (newline am Ende)

Die Seite wird geladen...

Problem mit sed (newline am Ende) - Ähnliche Themen

  1. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...
  2. grub-pc Probleme bei upgrade

    grub-pc Probleme bei upgrade: Hallo, ich habe beim dist-upgrade folgendes Problem: ---------- Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt. Trigger für...
  3. Problem bei apt-get upgrade (Kali 2.0)

    Problem bei apt-get upgrade (Kali 2.0): Hi, seit paar Tagen habe ich einige Probs. Dachte es sei mal an der Zeit für ein Update und nun tauchen da einige Fehler auf: Es müssen noch 0 B...
  4. Probleme mit YUM

    Probleme mit YUM: Hallo, ich habe CentOs 7 als Dualboot mit Windows 7 auf einen Dell Latitude E5510 installiert. Dies hat soweit auch alles geklappt. Leider habe...
  5. Problem mit Win-Zugriff auf SAMBA

    Problem mit Win-Zugriff auf SAMBA: Hallo rundherum, vielleicht hat jemand eine Idee... Habe jetzt schon 1 1/2 Tage damit verbraten und den Fehler nicht gefunden. Problem:...