Archiv verlassen und diese Seite im Standarddesign anzeigen : In die mitte einer Datei schreiben.
timtaylor
05.10.2007, 13:27
Hallo zusammen!
Ich werde momentan vom meinem Arbeitgeber in UNIX ausgebildet. Ich bin im aktuellen Kurs fast am Ende und muss einige Aufgaben bewältigen. Ich stehe nun vor dem Problem, dass ich die Ausgabe eines Scriptes in die MITTE einer anderen Datei schreiben soll.
Meine Idee ging dahin, die Lines mit wc -l zählen zu lassen, aber ich weis nicht, wie ich dann in die Datei schreibe.
Kann mir jemand einen Wink mit dem Zaunfahl geben?
DANKE
Mir würde momentan nur eine perverse Lösung mittels head -x und tail -x einfallen.
Also mit wc die Anzahl der Zeilen bestimmen und in lines sichern.
Mit head -($lines/2) die Erste hälfte ausgeben und in ein tmpfile pipen (>)
Danach alles was man einfügen möchte an die Datei anhängen (>>)
Letztenendes mit tail -($lines/2) den Rest vom Originalfile anhängen (>>)
Dann per mv das Originalfile mit dem tmpfile ersetzen.
Sorry - besser fällts mir nicht ein ;)
timtaylor
05.10.2007, 15:04
Mir würde momentan nur eine Perverse Lösung mittels head -x und tail -x einfallen.
Also mit wc die Anzahl der Zeilen bestimmen und in lines sichern.
Mit head -($lines/2) die Erste hälfte ausgeben und in ein tmpfile pipen (>)
Danach alles was man einfügen möchte an die Datei anhängen (>>)
Letztenendes mit tail -($lines/2) den Rest vom Originalfile anhängen (>>)
Dann per mv das Originalfile mit dem tmpfile ersetzen.
Sorry - besser fällts mir nicht ein ;)
ich glaub ich kann dir folgen.
meinst du:
lines=$"(wc -l dateiname) als var
oder
wc -l dateiname > dateiname
??
DANKE!
Mir würde momentan nur eine Perverse Lösung mittels head -x und tail -x einfallen.
Also mit wc die Anzahl der Zeilen bestimmen und in lines sichern.
Mit head -($lines/2) die Erste hälfte ausgeben und in ein tmpfile pipen (>)
Danach alles was man einfügen möchte an die Datei anhängen (>>)
Letztenendes mit tail -($lines/2) den Rest vom Originalfile anhängen (>>)
Dann per mv das Originalfile mit dem tmpfile ersetzen.
Sorry - besser fällts mir nicht ein ;)
Wenn es die Mitte sein soll, ist die Idee ganz gut, aber bei ungerader Zeilenzahl geht dir aufgrund des zweifachen Abrundens eine Zeile verloren. Mit tail --lines=$((($lines+1)/2)) sollte es gehen.
timtaylor
05.10.2007, 19:16
wie kann ich denn meinem scripts sagen, dass es in line 5 bzw. line 5 verbirgt sich hinter variabel $lines, schreiben soll?
wie kann ich denn meinem scripts sagen, dass es in line 5 bzw. line 5 verbirgt sich hinter variabel $lines, schreiben soll?
Konkret an einem Beispiel für die Bash v3.1.17, cat/head/tail/wc v6.7: in $LINE steht die Zeile (5), ab der du etwas einfügen willst. In $FILE steht der Name der Scriptdatei, die du erweitern willst (hier "mein_script").
$ echo $LINE
5
$ echo $FILE
mein_script
Eine Variable, die die Anzahl der Zeilen von $FILE speichert wäre hilfreich.
$ GESAMT=$(cat $FILE | wc -l)
$ echo $GESAMT
18
Bei mir ist mein_script achtzehn Zeilen lang. Was bei dir 'rauskommt, hängt natürlich von deiner Datei ab.
Jetzt nach Alamars Anleitung die ersten $LINE Zeilen von $FILE in eine temporäre Datei umleiten:
$ head --line=$LINE $FILE >bla.tmp
Danach die den neuen (eingeschobenen) Inhalt hinten dranhängen:
$ cat neue_zeilen >>bla.tmp
neue_zeilen ist eine Datei, die die neuen Zeilen enthält (falls das durch den Namen nicht schon ersichtlich war).
Dann zum Schluß die Zeile, welche nach $LINE in $FILE stehen auch noch dranhängen:
$ tail --line=$(($GESAMT-$LINE)) >>bla.tmp
Dann hast du in der Datei bla.tmp den Inhalt von $FILE, bei dem in Zeile $LINE der Inhalt der Datei neue_zeilen eingefügt wurde. Durch $(($GESAMT-$LINE)) wird die Differenz von $GESAMT und $LINE gebildet.
timtaylor
09.10.2007, 19:33
Konkret an einem Beispiel für die Bash v3.1.17, cat/head/tail/wc v6.7: in $LINE steht die Zeile (5), ab der du etwas einfügen willst. In $FILE steht der Name der Scriptdatei, die du erweitern willst (hier "mein_script").
$ echo $LINE
5
$ echo $FILE
mein_script
Eine Variable, die die Anzahl der Zeilen von $FILE speichert wäre hilfreich.
$ GESAMT=$(cat $FILE | wc -l)
$ echo $GESAMT
18
Bei mir ist mein_script achtzehn Zeilen lang. Was bei dir 'rauskommt, hängt natürlich von deiner Datei ab.
Jetzt nach Alamars Anleitung die ersten $LINE Zeilen von $FILE in eine temporäre Datei umleiten:
$ head --line=$LINE $FILE >bla.tmp
Danach die den neuen (eingeschobenen) Inhalt hinten dranhängen:
$ cat neue_zeilen >>bla.tmp
neue_zeilen ist eine Datei, die die neuen Zeilen enthält (falls das durch den Namen nicht schon ersichtlich war).
Dann zum Schluß die Zeile, welche nach $LINE in $FILE stehen auch noch dranhängen:
$ tail --line=$(($GESAMT-$LINE)) >>bla.tmp
Dann hast du in der Datei bla.tmp den Inhalt von $FILE, bei dem in Zeile $LINE der Inhalt der Datei neue_zeilen eingefügt wurde. Durch $(($GESAMT-$LINE)) wird die Differenz von $GESAMT und $LINE gebildet.
DANKE!!!!!!!!!!!!!!!!!!!!!!
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.