Datei zeilenweise schreiben

D

derwunner

Doppel-As
Hallo,
ist es mit Bash Mitteln irgendwie möglich, eine Datei mit schreibenden Zugriff zu öffnen, Zeile für Zeile rausschreiben und sie dann wieder schließen zu können?
Ich kann leider keine Programmiersprache dafür verwenden, weil es Plain Text Dateien sein müssen. In den Shell Skripten müssen nämlich vor der Ausführung noch Ersetzungen nach bestimmten Textmustern vorgenommen werden.

Bis jetzt leite ich die Ausgabe von echo in eine Datei um. Das ist aber auch nicht die fein englische Art und ich bin mir sicher, dass es dafür eine bessere Lösung gibt. Ich hatte mir auch schonmal das Tool sed angeschaut. Das hatte es leider auch nicht so gebracht. Stundenlang googeln half mir leider auch nicht weiter.

Ich hoffe, Ihr könnt mir weiterhelfen.

MFG derwunner
 
Ich versteh den Grund nicht zwingend zeilenweise schreiben zu müssen.

Bash skripte führen ja einzelne Programme aus, um sowas wie write locks brauchst du dich dabei nicht zu kümmern. Wenn du "plain text" Programme ausführen willst kannst du auch perl verwenden, oder einfach das, was du ändern willst als Parameter in ein Programm übergeben.

E: wenn du wirklich stundenlan suchst und nichts findest ist das üblicherweise ein Indikator dafür, dass das was du machen willst anders viel einfacher geht.
 
Es ist kein Problem, eine Datei mit der Bash zeilenweise zu bearbeiten. Oder verstehe ich hier was falsch? Was willst Du denn tun?
 
zum Beispiel
Code:
awk '{print $0}' datei.text
. Die meisten Shell-Programme bearbeiten Dateien doch Zeilenweise. Wahrscheinlich meinst Du etwas anderes...?
 
Ja klar, das weiß ich auch. Ich versuchs euch mal im Pseudo Code zu zeigen, was ich meine:
Code:
Variable b = Datei zum Schreiben öffnen
b.schreibeZeile($text)
b.schreibeZeihle($text2)
b.schliessen()

Also ich meine ob ich in der Shell die Dateiverarbeitung genauso wie in Java oder PHP machen kann. Einen Stream in den Arbeitsspeicher laden, Zeilen rausschreiben in den Arbeitsspeicher, die Datei auf die Festplatte flushen und schließen.
 
Nein, genau so wie in PHP oder in Java geht das nicht.
Du kannst in Dateien zeilenweise schreiben, aber nicht in diesem Sinne auf eine Variable in den Hauptspeicher laden und dann eine Funktion dieser anwenden.
Was du machst ist typisch objektorientiertes Denken. Die Datei ist in deinem Pseudocode eine Instanz einer Klasse, die die öffentliche Methode schreibeZeile mit einem Parameter vom Typ String anbietet.
Die bash kennt jedoch keine Klassen; Lediglich Funktionen und Ausdrücke.

VG

Schard
 
Jein, es geht schon, aber statt zeilenweise zu schreiben kannst du Text hinten an eine Datei anhängen.

Code:
echo $text >> datei
echo $text2 >> datei

und schließen muss sich die Datei selber. Bash ist wesentlich mächtiger, als java und php, probier nicht diese dumme syntax und denkweise auf deine bash skripte anzuwenden, damit machst du dich nur unglücklich.
 
... was auch geht (und manchmal sogar ganz nützlich sein kann :) -
Code:
exec 3>out

echo aaa >&3
(
echo bbb
echo ccc
) >&3

exec 3>&-
wird m.E. bei grösseren Skripten (mehrere solche Redirects) aber leicht unübersichtlich.

A.
 
Bin jetzt doch auf Perl umgestiegen.
Nur noch eine Frage, warum wenn ich
Code:
#!/usr/bin/perl
open(LOG, ">>datei");
print LOG "hallo";
close(LOG);
eingebe, hängt er mir es nicht an? Stattdessen wird die Datei geleert, wie bei >. Ich prüfe aber auch nicht, ob es die Datei schon gibt. Gemerkt hat er aber deswegen auch nicht.
 
Wenn ich das ausführe passt es

Code:
$ ./dum 
$ cat datei 
hallo$ ./dum 
$ cat datei 
hallohallo$
 
Ich habe es mittlerweile auch gelöst. Im Original war dort eine Variable, die ich so falsch hingeschrieben hatte, das war alles. Die Aufgabe wird jetzt komplett in Perl bewältigt. Danke für eure Hilfe!
 
Zurück
Oben