BASH: Zeilenweises Löschen aus Textfiles *SOLVED*
GrandAdmiralThrawn 05.06.2007 - 12:57 1110 8
GrandAdmiralThrawn
XP Nazi
|
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
|
erm... was jetzt? Ganze zeilen, oder mit Delimitern?!
|
spunz
ElderElder
|
am einfachsten wäre wohl awk, gibts für praktisch jedes os.
|
GrandAdmiralThrawn
XP Nazi
|
Ganze Zeilen!
@spunz: Hab schon befürchtet, mal wieder auf awk zurückgreifen zu müssen... Danke trotzdem!
|
COLOSSUS
AdministratorGNUltra
|
awk ist dafuer eindeutig Overkill. 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 ![:)](/images/smilies/smile.gif) E: pwnd hard! :ugly:
|
gue
Addicted
|
sed -e '3d' -e '7d' yourfile > newfile
edit: pwnd
|
COLOSSUS
AdministratorGNUltra
|
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 sed "commands" sourcefile > tmpfile && mv tmpfile sourcefile
Im Gegensatz zu dem nicht anzuratenden Versuch unten: sed "commands" sourcefile > sourcefile
was einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst.
|
gue
Addicted
|
was einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst. Ja, eine schmerzliche Erfahrung ![:(](/images/smilies/frown.gif) 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): #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
|
Herzlichen Dank, das hat's gebracht @ COLOSSUS / @ gue!
*solved*
Bearbeitet von GrandAdmiralThrawn am 05.06.2007, 15:08
|