BASH: Zeilenweises Löschen aus Textfiles *SOLVED*

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/bash_zeilenweises_loeschen_aus_textfiles_solved_180999/page_1 - zur Vollversion wechseln!


GrandAdmiralThrawn schrieb am 05.06.2007 um 12:57

Grüß euch!

Hat jemand eine Idee, wie man in Bash ein Textfile öffnen und bestimmte Zeilen rauslöschen kann? Also hier gehts um Zeilennummern, ich möchte z.B. Zeile 3 und 7 draußen haben.

Die Idee war, das File zu öffnen, dann irgendwie die Zeilen nach Nummer rauszufiltern, und den Output wieder ins File umzuleiten.

Mit "cut" bin ich nicht entsprechend zusammengekommen, weil ich eben keine spezifischen Delimiter nutzen kann, sondern Zeilennummern. Hilfe wäre erwünscht!

Vielen Dank!


Lobo schrieb am 05.06.2007 um 13:01

erm... was jetzt?
Ganze zeilen, oder mit Delimitern?!


spunz schrieb am 05.06.2007 um 13:03

am einfachsten wäre wohl awk, gibts für praktisch jedes os.


GrandAdmiralThrawn schrieb am 05.06.2007 um 13:33

Ganze Zeilen!

@spunz: Hab schon befürchtet, mal wieder auf awk zurückgreifen zu müssen... Danke trotzdem!


COLOSSUS schrieb am 05.06.2007 um 13:41

awk ist dafuer eindeutig Overkill.

Code:
colo@ibmt40:~$ cat testfile.txt
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5
Zeile 6
Zeile 7
Zeile 8
Zeile 9
Zeile 10
colo@ibmt40:~$ sed -e "1,3d;6d;" testfile.txt
Zeile 4
Zeile 5
Zeile 7
Zeile 8
Zeile 9
Zeile 10

Hth :)


E: pwnd hard! :ugly:


gue schrieb am 05.06.2007 um 13:41

Code:
sed -e '3d' -e '7d' yourfile > newfile
edit: pwnd :(


COLOSSUS schrieb am 05.06.2007 um 13:48

Nur so nebenbei: Wenn man die Aenderungen direkt im File haben moechte, kann GNU sed auch in-place-editing, mit dem "-i"-Switch. Dann erspart man sich

Code:
sed "commands" sourcefile > tmpfile && mv tmpfile sourcefile

Im Gegensatz zu dem nicht anzuratenden Versuch unten:
Code:
sed "commands" sourcefile > sourcefile
was einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst.


gue schrieb am 05.06.2007 um 14:49

Zitat von COLOSSUS
was einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst.
Ja, eine schmerzliche Erfahrung :(
Wenn man das ganze aber in ein Programm piped, das die Daten dann in das File schreibt, sollte es funktionieren. Hab hier mal schnell so was zusammengehackt (sozusagen das Gegenteil von cat):
Code:
#include <stdio.h>
#include <stdlib.h>

#define GROWSIZE 2048

void usage(const char *name) {
	fprintf(stderr, "Usage: %s <file>\n", name);
}

int main(int argc, char **argv) {
	char *buf;
	int read = 0, size = GROWSIZE, pos = 0;
	FILE *op;
	if (argc < 2) {
		usage(argv[0]);
		return 1;
	}
	buf = (char *)malloc(sizeof(char) * size);
	while ((read = fread(buf + pos, sizeof(char), GROWSIZE, stdin)) == GROWSIZE) {
		pos = size;
		size += GROWSIZE;
		buf = realloc(buf, size);
	}
	size = pos + read;
	op = fopen(argv[1], "w");
	if (!op) {
		fprintf(stderr, "Could not open output file\n");
		free(buf);
		return 1;
	}
	fwrite(buf, sizeof(char), size, op);
	fclose(op);
	free(buf);
	return 0;
}
Dadurch kann man sed, grep, awk usw so verwenden:
sedOderGrepOderAwk infile | programm infile


GrandAdmiralThrawn schrieb am 05.06.2007 um 15:04

Herzlichen Dank, das hat's gebracht @ COLOSSUS / @ gue!

*solved*




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025