Womit würdet ihr das machen?
Womit würdet ihr das machen?
Hallo ihr,
ich wollte mal Folgendes fragen: Ich will ein Skript bzw. ein Programm schreiben, dass die Dateien in einem Verzeichnis einliest und dort nach einem bestimmten String sucht, ihn heraus löscht und dann die Datei wieder abspeichert.
Nun, C++ ist bei mir ne ganze Weile her und ich kenn mich auch noch nicht so mit diesen ganzen Sprachen wie Perl, Ruby oder Bash aus. Mit welcher Sprache würdet ihr das machen? Womit geht das am einfachsten? Damit ich weiß, wo ich mich einarbeiten muss. Vielleicht hat ja jemand auch schonmal ein ähnliches Skript geschrieben?!
Bitte helft mir.
ich wollte mal Folgendes fragen: Ich will ein Skript bzw. ein Programm schreiben, dass die Dateien in einem Verzeichnis einliest und dort nach einem bestimmten String sucht, ihn heraus löscht und dann die Datei wieder abspeichert.
Nun, C++ ist bei mir ne ganze Weile her und ich kenn mich auch noch nicht so mit diesen ganzen Sprachen wie Perl, Ruby oder Bash aus. Mit welcher Sprache würdet ihr das machen? Womit geht das am einfachsten? Damit ich weiß, wo ich mich einarbeiten muss. Vielleicht hat ja jemand auch schonmal ein ähnliches Skript geschrieben?!
Bitte helft mir.
Hi!
Das ist ein Shellskript, nein, nicht einmal das, sondern ein Einzeiler:
Grüße,
hjb
Das ist ein Shellskript, nein, nicht einmal das, sondern ein Einzeiler:
Code: Select all
for i in *; do sed -i -e 's/string//g' $i; done
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
Wie die Datei heißt ist egal. Sie muss nur in der ersten Zeile den Pfad zum Interpreter enthalten
und ausführbar sein.
Janka
Code: Select all
#!/bin/sh
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Mit perl wäre das Prinzip dasselbe (per Regulärem Ausdruck den String finden und durch nichts ersetzen), aber man könnte sich noch die for-Schleife sparen und sich Backups der Originaldateien anlegen lassen:Einfach am Kommandoprompt eintippen oder in eine Datei hineinschreiben, ein "#!/bin/sh" davorschreiben und die Datei mittels "chmod 755 string-loesch-skript" ausführbar machen.
-p lässt perl über alle Eingabedateien (*) laufen, wobei jede Zeile einzeln eingelesen, bearbeitet und ausgegeben wird. -i schaltet den In-Place-Edit-Modus ein, damit nicht in einer Kopie der Datei gearbeitet wird, sondern der Inhalt der Datei selbst verändert wird. ".bak" steht für die Erweiterung, die das Sicherheitsbackup bekommen soll. Und was dann getan werden soll, bestimmt das Argument zu -e, nämlich ein Suchen/Ersetzen mittels s///.
Grüße,
Jochen
Code: Select all
perl -p -i.bak -e 's/string//g;' *
-p lässt perl über alle Eingabedateien (*) laufen, wobei jede Zeile einzeln eingelesen, bearbeitet und ausgegeben wird. -i schaltet den In-Place-Edit-Modus ein, damit nicht in einer Kopie der Datei gearbeitet wird, sondern der Inhalt der Datei selbst verändert wird. ".bak" steht für die Erweiterung, die das Sicherheitsbackup bekommen soll. Und was dann getan werden soll, bestimmt das Argument zu -e, nämlich ein Suchen/Ersetzen mittels s///.
Grüße,
Jochen
Die grösste Lüge der EDV? "Mal eben..."
Wo das Skript liegt, ist egal. Du musst beim Aufruf in dem Verzeichnis drinstehen, das du damit bearbeiten willst.
Wenn du das Skript in ein Verzeichnis legst, das im Suchpfad der Shell ist (z.B. /usr/local/bin), kannst du es auch einfach mit "Meinskript" aufrufen.
Janka
Code: Select all
$ cd MeinVerzeichnis
$ PfadZumSkript/Meinskript
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Ich bin's nochmal.
Okay, ich hab's bis jetzt ganz gut hingekriegt und verstehe auch, was die Kommandos machen. Der Kofler hat mir dabei auch ganz gut geholfen. Jetzt noch eine Frage: Wie schaffe ich es, dass die gesamte Zeile, in der der String gefunden wurde, gelöscht wird? Ich hab schon etwas mit der d-Option herum gespielt, aber irgendwie ist dann am Ende immer die komplette Datei leer, er löscht also alle Zeilen.
Mein Shell-Skript sieht so aus:
#! /bin/bash
for i in *
do
sed -i -e 's/string//g' $i
done
Wo tue ich das d hin?
Okay, ich hab's bis jetzt ganz gut hingekriegt und verstehe auch, was die Kommandos machen. Der Kofler hat mir dabei auch ganz gut geholfen. Jetzt noch eine Frage: Wie schaffe ich es, dass die gesamte Zeile, in der der String gefunden wurde, gelöscht wird? Ich hab schon etwas mit der d-Option herum gespielt, aber irgendwie ist dann am Ende immer die komplette Datei leer, er löscht also alle Zeilen.
Mein Shell-Skript sieht so aus:
#! /bin/bash
for i in *
do
sed -i -e 's/string//g' $i
done
Wo tue ich das d hin?