Womit würdet ihr das machen?

Post Reply
Message
Author
Möchtegernprogrammierer

Womit würdet ihr das machen?

#1 Post by Möchtegernprogrammierer »

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.

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

#2 Post by hjb »

Hi!

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
Grüße,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Möchtegernprogrammierer

#3 Post by Möchtegernprogrammierer »

Ui, also so einfach ist das? Ehm, und Shellskript bedeutet, dass ich das in eine SH-Datei abspeichere? Oder wie gehe ich dann damit weiter vor?

Dank dir für deine Hilfe, Grüße aus Links um die Ecke (Karlsruhe / Hagsfeld) :wink:

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

Wie die Datei heißt ist egal. Sie muss nur in der ersten Zeile den Pfad zum Interpreter enthalten

Code: Select all

#!/bin/sh
und ausführbar sein.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#5 Post by jochen »

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:

Code: Select all

perl -p -i.bak -e 's/string//g;' *
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
Die grösste Lüge der EDV? "Mal eben..."

Möchtegernprogrammierer

#6 Post by Möchtegernprogrammierer »

Cool. Danke für die Hilfe und die ausführliche Erklärung. Muss ich denn das Skript in dem Ordner zu liegen haben, in dem ich diese Dateien bearbeiten lassen will, oder kann ich dem auch irgendwie einen Pfad angeben? Ein Backup der Dateien brauch ich allerdings nicht.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#7 Post by Janka »

Wo das Skript liegt, ist egal. Du musst beim Aufruf in dem Verzeichnis drinstehen, das du damit bearbeiten willst.

Code: Select all

$ cd MeinVerzeichnis
$ PfadZumSkript/Meinskript
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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Möchtegernprogrammierer

#8 Post by Möchtegernprogrammierer »

Okay. Dann bin ich informiert. Danke nochmal euch allen, für die Hilfe. Dann werde ich mich mal ran setzen ... *fingerreib*

Möchtegernprogrammierer

#9 Post by Möchtegernprogrammierer »

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?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#10 Post by Janka »

Nimm als regexp für sed '^.*String.*$' statt "String". Dann matched er die ganze Zeile, wenn darin String vorkommt.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Möchtegernprogrammierer

#11 Post by Möchtegernprogrammierer »

Ich will aber, dass die Zeile richtig raus aus der Datei ist. Wenn ich das mache, was du sagst, ist die Zeile selbst zwar leer, aber eben noch da...

Möchtegernprogrammierer

#12 Post by Möchtegernprogrammierer »

Juchu, ich hab's:

#! /bin/bash
for i in *
do
sed -i -e '/string/d' $i
done

So geht's. Damit wäre ich dann erstmal wunschlos glücklich. Dank euch nochmals.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#13 Post by Janka »

Oder: 's/^.*String.*$//g;T l1;d;:l1;'

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply