3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von derilzemer, 12.03.2013.

  1. #1 derilzemer, 12.03.2013
    derilzemer

    derilzemer Grünschnabel

    Dabei seit:
    12.03.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo,
    ich bin neu, mache aktuell privat ein wenig mit sed herum, da ich aktuell bei ca. 6500 Dateien HTML Code abändern will. Eine Anforderung ist, in einer bestimmten Seite die 3. letzte Zeile ( </div> ) zu löschen oder alternativ ab Zeile 55 diesen String zu suchen und zu ersetzen. Leider ist die Zeilennummer nicht immer die gleiche, sonst wäre die Aufgabe leichter und für mich wohl auch lösbar. Ebenso wäre es einfach, wenn dieser Ausdruck nur einmal auf der Seite vorkäme, ist so aber nicht.
    Nun weiss ich nicht, wie ich dies mit sed lösen kann und komme nicht weiter. Wenn Awk dafür besser ist, dann soll das nicht das Problem sein. Fakt ist, dass mein Wissen diesbezüglich seine Grenzen erreicht hat. Google hat sich nicht als mein Freund erweisen, was wohl auch an meinen Suchkriterien liegen kann/könnte ?(
    Meine Skriptkenntnisse sind ....sagen wir mal bescheidenst. Deswegen würde ich diesbezüglich gerne noch die Frage anhängen, wie ich es lösen kann im Script, dass er nur eine bestimmte Datei mit diesem löschen der 3. letzten Zeile anspricht. Die Dateien welche davon betroffen sind können z.B. so heißen
    0148_1971.htm / 0205_1971.htm / 1003_1965.htm usw. Sie unterscheiden sich von den anderen Dateien der Verzeichnisse nur dadurch, dass vor dem .htm immer eine Zahl steht, alle anderen haben davor ein *b.htm, *d.htm usw. Kann man so etwas mit einem RegEx abfangen?

    Für einen Tip bzw aktive Hilfe wäre ich ausgesprochen dankbar

    mfG aus der Pfalz
    Andreas Müller
     
  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 bytepool, 13.03.2013
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    willkommen im Board!

    Ich merke gerade dass ich schon ewig keine Shell Skripte mehr geschrieben hab, ich bin ein wenig eingerostet. ;)

    Zum ersten Problem:
    Code:
    tac 123.html | sed '3d' | tac
    
    tac ist das Gegenstueck zu cat, d.h. er gibt die Datei Rueckwaerts aus. Dann loescht sed die dritte Zeile, und dann drehst du's mit tac wieder um. Das ist garantiert extrem langsam und unnoetig, ist aber grad das erste was mir einfaellt. Du musst dann mit der Ausgabe nur noch machen was du willst, z.B. mit ner Umleitung wieder zurueck in die Datei schreiben (>123.html).

    Zum zweiten Problem:
    Code:
    for i in [0-9]*; do echo $i; done
    
    Ich hab mich schon laenger nicht mehr intensiv mit Globbing beschaeftigt, aber der Ausdruck sollte dir alle Dateien im aktuellen Verzeichnis geben die mit einer Zahl beginnen. Du musst mal gucken ob das schon tut was du willst, oder ob du das weiter einschraenken musst.

    MfG,
    bytepool
     
  4. #3 derilzemer, 13.03.2013
    derilzemer

    derilzemer Grünschnabel

    Dabei seit:
    12.03.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Hi,

    merci für die schnelle Antwort erst einmal.

    Auf die Gefahr hin, dass ich hier schwer abgewatscht werde, muss ich gestehen, dass ich es hier schon nicht hinbekomme. Ich habe ganz normal auf der cli den Befehl mal an einer Testdatei abgesetzt und

    Code:
    tac 0180_1968.htm | sed -i '3d'| tac > test.htm
    Da hat er dann folgendes fabriziert :think:
    Code:
     
    
    Original Dateiende
    </tr>
    </table>
    </div>
    </body>
    </html>
    
    Neue Datei Dateiende
    
    </tr>
    </div>
    </html></body>
    
    Er hat in der Tat gelöscht, von der neuen Datei aus gesehen Zeile 3. Da hat er aber wohl beim umdrehen
    Code:
    </html></body>
    in eine Zeile gemacht und dann gezählt. In Wirklichkeit ist es aber Zeile 4 gewesen, die er gelöscht hat. Warum :think:


    Wenn ich es so versuche, dann gibt er mir alles aus was er so findet in Punkto Zahlen, * sagt ja auch alles, oder?

    Ich dachte mir schon es geht was wie z.B.
    Das ging auch, jedoch macht er auch Dateien, die er nicht soll. Jo, das ist mal der aktuelle Stand. Eventuell hast du noch einen Tip.

    Gruß Andreas
     
  5. #4 derilzemer, 13.03.2013
    derilzemer

    derilzemer Grünschnabel

    Dabei seit:
    12.03.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Hi,

    hab gerade eben mal folgendes versucht.

    Code:
    tac 0180_1969.htm | sed '0,/<\/div>/{//d;}' | tac > test.htm
    Dreht um, löscht nur die erste zu suchende Pattern beim antreffen.
    Das geht diesemal mit dem löschen, aber auch hier macht er beim zurückschreiben in die neue Datei ebenso am Abschluss aus

    Code:
    </table>
    </div>
    </body>
    </html>
    ~~~~~
    </table>
    </html></body>
    
    er stellt die nicht nur nebeneinander sondern dreht auch die beiden TAGS um :(

    Gruss Andreas
     
  6. #5 bytepool, 13.03.2013
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    Also wenn dein sed diesen Befehl akzeptiert wuerde ich erstmal nach der sed Version und der Shell fragen. Bei mir spuckt sed da naemlich erwartungsgemaess einen Fehler aus, -i macht in dem Zusammenhang einfach keinen Sinn.

    Du hast nicht zufaellig Windows und Unix line endings in den Dateien gemischt (\n vs \r\n), oder? Mit einer kleinen Testdatei passiert bei mir genau das erwartete, ich hab aber nix grosses getestet.


    Deswegen sagte ich, du musst mal gucken ob's das fuer dich tut, mir war naemlich nicht klar nach welchem Muster du genau suchst. Wie gesagt, der Ausdruck gibt dir alle Dateien aus die mit einer Zahl beginnen. Wenn ich dich jetzt richtig verstehe willst du aber nur html Dateien die keine Buchstaben vor der Dateiendung haben.

    Wenn du z.B. weisst dass dein Muster aus 4 Zahlen, einem Unterstrich und nochmal 4 Zahlen besteht, wuerde das hier funzen:
    Code:
    [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9].html
    
    Das haengt alles davon ab wie genau du es definieren willst/kannst, und was noch so alles in dem Ordner ist. Es geht auch viel komplizierter, mir fallen mehrere Moeglichkeiten ein das weiter einzugrenzen, aber wenn's du's mit Globbing hinkriegst ist das schon am einfachsten und schnellsten.

    Edit:
    Falls deine Antwort darauf ja lautet, schau dir mal dos2unix an.

    MfG,
    bytepool
     
Thema:

3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen

Die Seite wird geladen...

3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen - Ähnliche Themen

  1. SED letzte Zeile löschen

    SED letzte Zeile löschen: Hallo, habe ein Problem mit folgendem sed Befehl sed -n '/regexp1/,/regexp2/p' # gibt den inhalt zwischen regexp1 und regexp2 an inklusive...
  2. abschneiden nach letztem Zeichen einer Zeile

    abschneiden nach letztem Zeichen einer Zeile: Hallo, ich möchte nach dem letzten Zeichen einer Zeile [0-9 oder A-Z] mögliche Leerzeichen entfernen. Beispiel aus: ADASDF_ASDFASDF____ (...
  3. Textfile mit Text separiert durch Leerzeile, wie letzten Text rausbekommen?

    Textfile mit Text separiert durch Leerzeile, wie letzten Text rausbekommen?: Hi, wie geschrieben, ich habe ein Textfile, welches quasi so aussieht: Text text text text text text text letzter text bevor...
  4. Letzte Zeile eines Treffers ausgeben

    Letzte Zeile eines Treffers ausgeben: Hi Zusammen, kennt jemand einen weg um sich die letzte Zeile eines Treffers beim Suchen eines strings aus einer Textdatei ausgeben...
  5. Letzten Zeilen einer Datei löschen

    Letzten Zeilen einer Datei löschen: Hallo Leute, ich habe eine riesige Datei (ca. 300 MB) und möchte die letzten Zeilen löschen. Leider kann man aufgrund der Größe der Datei diese...