ubuntuusers.de

Manipulation von Textdateien mit Shell-Script

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Wolle69

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Servus!

Ich möchte ein paar Textdateien mittels Shell-Script (Bitte nur bash! Ich muss mich derzeit in dermaßen verschiedene Sprachen einarbeiten, dass es nicht mehr lustig ist.) manipulieren. Wie ich auf die einzelnen Dateien zugreife, weiß ich.

Konkret sieht es so aus, dass jede Datei eine bestimmte erste Zeile enthält, die auch immer (in jeder Datei) gleich ist. Diese soll ersetzt werden mit $ERSTE_ZEILE + " " + $DATEINAME. $ERSTE_ZEILE habe ich zwar nicht, aber da das immer gleich ich, muss es nicht gelesen sein, sondern ich kann das als konstanten String einbauen also z.B. "blafasel "+$DATEINAME. Wie ersetze ich nun aber diese erste Zeile? Muss ich eine neue Datei erstellen, dort die Wunschzeile einfügen, dann die zu kopierende Datei bis auf die erste Zeile (also ab der zweiten Zeile) anhängen, anschließend ursprüngliche Datei löschen und neue Datei umbenennen? Das erscheint mir umständlich, aber gangbar. Und ich weiß nicht so recht, wie ich die anzuhängende Datei Zeile für Zeile verarbeite.

Ciao

Wolle

P.S.: Den Dateinamen hole ich mir über basename.

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

NEUE_ZEILE=$(Kommando_das_die_neue_zeile_ausgibt)
sed -i '1s/^.*$/'"$NEUE_ZEILE"'/' dateiname

Sollte gehen.

Dabei sollte $NEUE_ZEILE keine " oder ' enthalten, sonst müsstest du die entsprechen maskieren (siehe QUOTING im Bash Manual)

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Einfacher:

sed -i "1c$NEUE_ZEILE" dateiname

Wolle69

(Themenstarter)

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Servus!

Sehr schön, so funktioniert das (diesch's Lösung).

Verratet ihr mir noch, wie ich eine Leerzeile ans Ende einer Datei anfüge? Meine Versuche waren:

sed -i "a\\" dateiname  #man müsste doch denken, dass append eben ans Ende geht...
sed -i  "$a\\" dateiname #man-page sagt: adress $ wäre last line...

Aber das klappt so nicht. Die Syntax von sed ist echt ein Mysterium für mich (ebenso wie awk) und auch die man-pages sind da wenig hilfreich. Damit sind das schlichtweg DIE beiden Werkzeuge, vor deren Gebrauch ich mich stets zu drücken versuche...

Ciao

Wolle

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

Mit sed fällt es mir gerade nicht ein. Aber ed:

printf "$\na\n\n.\nw\nq\n" | ed datei

Wolle69

(Themenstarter)

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Servus!

Da war mein Wissensdurst doch größer... 😉

 sed -i "$ a
" >> dateiname

Inklusive (!) des Zeilenumbruchs (wer hat sich das nur ausgedacht?)...

Danke trotzdem für die Hilfe. Vielleicht kapier ich sed/awk ja doch noch irgendwann... 😉

Ciao Wolle

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

sed -i '$a\ ' dateiname

geht mit GNU sed auch auch.

Du kannst auch beides mit einem sed-Aufruf machen:

sed -i -e "1c$NEUE_ZEILE" -e '$a\ ' dateiname

Für sed lohnt sich die Info-Seite (info sed auf der Kommandozeile oder im Hilfe-Browser), für awk die gawk-Info-Seite (Paket gawk-doc muss installiert sein).

Wolle69

(Themenstarter)

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Moin!

diesch schrieb:

sed -i '$a\ ' dateiname

geht mit GNU sed auch auch.

Dann steht da aber ein Leerzeichen (denke ich zumindestens ausprobiert zu haben)... oder?

Du kannst auch beides mit einem sed-Aufruf machen:

sed -i -e "1c$NEUE_ZEILE" -e '$a\ ' dateiname

Sicherlich gut zu wissen. Lässt sich aber blöder kommentieren (und das mache ich Zeile für Zeile, damit ich morgen noch weiß, was ich heute so zusammengebastelt habe). Andererseits: möglich wäre es in meinem Fall schon, jedoch unschön hinsichtlich der Struktur des Programmablaufes. Natürlich trotzdem danke, ich lerne immer gerne dazu.

Für sed lohnt sich die Info-Seite (info sed auf der Kommandozeile oder im Hilfe-Browser), für awk die gawk-Info-Seite (Paket gawk-doc muss installiert sein).

Jupp.

Ciao

Wolle

Antworten |