Zeile in Datei ändern?
- Yadgar
- Beiträge: 983
- Registriert: 22.11.2010 22:11:08
- Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
-
Kontaktdaten:
Zeile in Datei ändern?
Hi(gh)!
In einer riesenlangen (zig Millionen Zeilen) POV-Ray-Datei (ASCII-Text) muss in Zeile Nr. 12967207 ein Komma entfernt werden. Mit KWrite hinscrollen würde viel zu lange dauern - wie stelle ich das am besten an?
In einer riesenlangen (zig Millionen Zeilen) POV-Ray-Datei (ASCII-Text) muss in Zeile Nr. 12967207 ein Komma entfernt werden. Mit KWrite hinscrollen würde viel zu lange dauern - wie stelle ich das am besten an?
Bis bald im Khyberspace!
Yadgar
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...
Yadgar
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...
Re: Zeile in Datei ändern?
Etwa so:
Zu beachten: Mit -i wird direkt in der angegebenen Datei ersetzt.
Code: Alles auswählen
$ sed -i "12967207s/,//" POV-Ray.Datei
Manchmal bekannt als Just (another) Terminal Hacker.
- Yadgar
- Beiträge: 983
- Registriert: 22.11.2010 22:11:08
- Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
-
Kontaktdaten:
Re: Zeile in Datei ändern?
Hi(gh)!
Now playing: Parallels, live 1978 (Yes)
Danke für den Tipp! Rechne schon mal damit, dass demnächst in POVghanistan ein bislang namenloser Viertausender im Mittleren Hindukusch nach dir benannt wird - Koh-e JTH, das ist doch was, oder?JTH hat geschrieben:08.03.2020 20:48:04Etwa so:Zu beachten: Mit -i wird direkt in der angegebenen Datei ersetzt.Code: Alles auswählen
$ sed -i "12967207s/,//" POV-Ray.Datei
Now playing: Parallels, live 1978 (Yes)
Bis bald im Khyberspace!
Yadgar
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...
Yadgar
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...
Re: Zeile in Datei ändern?
Du hättest natürlich auch den Editor Vim bemühen können.
Und dann an der Stelle das Komma z. B. mit "x" löschen.
Getestet nur mit einer 5 Millionen Zeilen langen Datei. War zu faul eine größere Datei zu erzeugen.
Code: Alles auswählen
12967207G
12967207gg
:12967207<CR>
Getestet nur mit einer 5 Millionen Zeilen langen Datei. War zu faul eine größere Datei zu erzeugen.
Re: Zeile in Datei ändern?
Ist vi/vim vorhanden, dann hätte es Vorteile den ex-Mode benutzen:
Alternativ natürlich auch mit ed.
Code: Alles auswählen
ex - POV-Ray.Datei <<EOF
12967207s/,//
wq
EOF
Re: Zeile in Datei ändern?
Ich dachte eigentlich, Meillo wirft das noch in die Runde
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Zeile in Datei ändern?
Das Problem war mit der ersten Antwort ja schon geloest.
Den Ansatz mit ex finde ich am besten. (vi (also der grafische Teil des Doppeleditors) ist hier nur unnoetiger Ballast.)
So sehr ich ed auch mag, in solchen Faellen verwende ich ihn nicht. Wie alle alten Unix-Tools hat er seine Massengrenzen (Zeilenlaenge und Co.). Ein Vim kommt mit allem zurecht, ein ed nicht unbedingt, bzw. ist er nicht dafuer ausgelegt. Vieles klappt, aber nicht jeder Fall zwangslaeufig. Deshalb wuerde ich in dem Fall einen Vim im ex-Mode nutzen.
Der ex ist im Uebrigen ein interessanter aber in eigenstaendiger Weise kaum genutzer Editor. Er ist recht faehig, dadurch aber leider auch nicht so schoen klein und einfach wie der ed.
Den Ansatz mit ex finde ich am besten. (vi (also der grafische Teil des Doppeleditors) ist hier nur unnoetiger Ballast.)
So sehr ich ed auch mag, in solchen Faellen verwende ich ihn nicht. Wie alle alten Unix-Tools hat er seine Massengrenzen (Zeilenlaenge und Co.). Ein Vim kommt mit allem zurecht, ein ed nicht unbedingt, bzw. ist er nicht dafuer ausgelegt. Vieles klappt, aber nicht jeder Fall zwangslaeufig. Deshalb wuerde ich in dem Fall einen Vim im ex-Mode nutzen.
Der ex ist im Uebrigen ein interessanter aber in eigenstaendiger Weise kaum genutzer Editor. Er ist recht faehig, dadurch aber leider auch nicht so schoen klein und einfach wie der ed.
Use ed once in a while!
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Zeile in Datei ändern?
vi(m) braucht beim editieren so einer riesen Datei aber auch jede Menge RAM.
sed z. B. nicht weil er die Datei nur zeilenweise liest. (ex auch nicht?)
Hier mal ein Beispiel mit meinem USB-Stick-Backup(2 GB)
sed z. B. nicht weil er die Datei nur zeilenweise liest. (ex auch nicht?)
Hier mal ein Beispiel mit meinem USB-Stick-Backup(2 GB)
Code: Alles auswählen
du -sm muellhalde/usbstick.raw
2105 muellhalde/usbstick.raw
/usr/bin/time sed -n '12432453p' muellhalde/usbstick.raw
0.71user 0.30system 0:01.02elapsed 100%CPU (0avgtext+0avgdata 3812maxresident)k
0inputs+0outputs (0major+547minor)pagefaults 0swaps
/usr/bin/time vim -c ":q" muellhalde/usbstick.raw
22.73user 1.39system 0:24.13elapsed 100%CPU (0avgtext+0avgdata 3762888maxresident)k
0inputs+64outputs (0major+940343minor)pagefaults 0swaps
Re: Zeile in Datei ändern?
Das ist ein guter Aspekt. vi/ex legen normalerweise eine Kopie der zu editierenden Datei an, in der die Veraenderungen passieren, bis sie zurueckgeschrieben werden koennen. Darum kann man die Arbeitsergebnisse nach einem Programmabsturz auch recovern. (Was Vim konkret macht, weiss ich nicht.)heisenberg hat geschrieben:09.03.2020 21:08:02vi(m) braucht beim editieren so einer riesen Date aber auch jede Menge RAM.
sed z. B. nicht weil er die Datei nur zeilenweise liest. (ex auch nicht?)
Allerdings verwenden wir hier ja `sed -i' (!) folglich reicht Lesen alleine nicht aus. Aber hier ebenfalls: Wie die Implementierung das konkret macht, entzieht sich meiner Kenntnis.
Du muesstest hier schon `sed -i' verwenden, um aussagekraeftige Werte zu bekommen.Code: Alles auswählen
du -sm muellhalde/usbstick.raw 2105 muellhalde/usbstick.raw /usr/bin/time sed -n '12432453p' muellhalde/usbstick.raw 0.71user 0.30system 0:01.02elapsed 100%CPU (0avgtext+0avgdata 3812maxresident)k 0inputs+0outputs (0major+547minor)pagefaults 0swaps /usr/bin/time vim -c ":q" muellhalde/usbstick.raw 22.73user 1.39system 0:24.13elapsed 100%CPU (0avgtext+0avgdata 3762888maxresident)k 0inputs+64outputs (0major+940343minor)pagefaults 0swaps
Und statt `vim' den Befehl `ex', dann einfach den Doppelpunkt vor den Ex-Befehlen weglassen. Der Kommandotrenner ist ein Pipe-Symbol. Also z.B.:
Code: Alles auswählen
ex -c '12432453p|q'
Edit: Was viel RAM verbrauchen koennte, koennten auch lange Zeilen sein. In deinem Image hat es evtl. wenig Newlines. Das ist dann eine andere Situation wie wenn du Textdateien hast.
Use ed once in a while!
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Zeile in Datei ändern?
sed -i ist ein normaler sed-Lauf in eine temporäre Datei. Diese Datei übeschreibt am Ende dann per mv die Originaldatei. Beschreibung dazu ist in der info-page von gnu sed.Allerdings verwenden wir hier ja `sed -i' (!) folglich reicht Lesen alleine nicht aus. Aber hier ebenfalls: Wie die Implementierung das konkret macht, entzieht sich meiner Kenntnis.
Im vorliegenden Fall heisst dass: Die Datei wird einmal komplett gelesen und einmal fast komplett geschrieben.