"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

BASH: Zeilenweises Löschen aus Textfiles *SOLVED*

GrandAdmiralThrawn 05.06.2007 - 12:57 1066 8
Posts

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
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!
Bearbeitet von GrandAdmiralThrawn am 05.06.2007, 15:06

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2540
erm... was jetzt?
Ganze zeilen, oder mit Delimitern?!

spunz

Super Moderator
Super Moderator
Avatar
Registered: Aug 2000
Location: achse des bösen
Posts: 11120
am einfachsten wäre wohl awk, gibts für praktisch jedes os.

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ganze Zeilen!

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

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11903
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

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Code:
sed -e '3d' -e '7d' yourfile > newfile
edit: pwnd :(

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11903
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

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Herzlichen Dank, das hat's gebracht @ COLOSSUS / @ gue!

*solved*
Bearbeitet von GrandAdmiralThrawn am 05.06.2007, 15:08
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz