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

D

derilzemer

Grünschnabel
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
 
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
 
Hi,

merci für die schnelle Antwort erst einmal.

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

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:


Zum zweiten Problem:
Code:
for i in [0-9]*; do echo $i; done

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

:/var/www/quartis/bilder/Einzelbilder_thumbs# for i in [0-9]*; do echo $i; done
0180_1968.htm
0180_1970_GB.htm
0_make_thumbnails_sonder.sh
1_make_thumbnails_quarts.sh
2_make_thumbnails_quarts_png.sh
3201_1972_24
3_make_thumbnails_sonder_png.sh
53222_1971_42

Ich dachte mir schon es geht was wie z.B.
sed -i '{s/<td><a href="/\x9<td><a href="/g;s/<img src="/\x9\x9<img src="/g}' [0-9]*_[0-9]*.htm
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
 
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
 
Hi,

Code:
tac 0180_1968.htm | sed -i '3d'| tac > test.htm

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.

Da hat er dann folgendes fabriziert :think:
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.


Wenn ich es so versuche, dann gibt er mir alles aus was er so findet in Punkto Zahlen, * sagt ja auch alles, oder?
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:
Du hast nicht zufaellig Windows und Unix line endings in den Dateien gemischt (\n vs \r\n), oder?
Falls deine Antwort darauf ja lautet, schau dir mal dos2unix an.

MfG,
bytepool
 

Ähnliche Themen

SED letzte Zeile löschen

Zeilenweise suchen, löschen und ersetzen / Inhalt einfügen

Zeilen löschen und ersetzen mit sed

bestimmte Zeile(n) in Datei löschen

Server-Monitoring mit RRDTool

Zurück
Oben