URL: https://www.overclockers.at/coding-stuff/bash_zeilenweises_loeschen_aus_textfiles_solved_180999/page_1 - zur Vollversion wechseln!
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!
erm... was jetzt?
Ganze zeilen, oder mit Delimitern?!
am einfachsten wäre wohl awk, gibts für praktisch jedes os.
Ganze Zeilen!
@spunz: Hab schon befürchtet, mal wieder auf awk zurückgreifen zu müssen... Danke trotzdem!
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
edit: pwndCode:sed -e '3d' -e '7d' yourfile > newfile
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
was einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst.Code:sed "commands" sourcefile > sourcefile
Ja, eine schmerzliche ErfahrungZitat von COLOSSUSwas einen aufgrund des Parsens der Input Redirection (right to left) mit einem leeren "sourcefile" zuruecklaesst.
Dadurch kann man sed, grep, awk usw so verwenden: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; }
Herzlichen Dank, das hat's gebracht @ COLOSSUS / @ gue!
*solved*
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025