Womit würdet ihr das machen?

Antworten
Nachricht
Autor
Möchtegernprogrammierer

Womit würdet ihr das machen?

#1 Beitrag von Möchtegernprogrammierer » 10. Jun 2007 12:19

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.

Benutzeravatar
hjb
Pro-Linux
Beiträge: 3264
Registriert: 15. Aug 1999 16:59
Wohnort: Bruchsal
Kontaktdaten:

#2 Beitrag von hjb » 10. Jun 2007 19:00

Hi!

Das ist ein Shellskript, nein, nicht einmal das, sondern ein Einzeiler:

Code: Alles auswählen

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 Beitrag von Möchtegernprogrammierer » 11. Jun 2007 17:51

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:

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#4 Beitrag von Janka » 11. Jun 2007 19:48

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

Code: Alles auswählen

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

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

Benutzeravatar
jochen
prolinux-forum-admin
Beiträge: 699
Registriert: 14. Jan 2000 15:37
Wohnort: Jülich
Kontaktdaten:

#5 Beitrag von jochen » 12. Jun 2007 7:50

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: Alles auswählen

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 Beitrag von Möchtegernprogrammierer » 12. Jun 2007 10:21

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.

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#7 Beitrag von Janka » 12. Jun 2007 18:36

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

Code: Alles auswählen

$ 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 Beitrag von Möchtegernprogrammierer » 12. Jun 2007 19:47

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

Möchtegernprogrammierer

#9 Beitrag von Möchtegernprogrammierer » 15. Jun 2007 22:42

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?

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#10 Beitrag von Janka » 15. Jun 2007 22:53

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 Beitrag von Möchtegernprogrammierer » 15. Jun 2007 23:06

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 Beitrag von Möchtegernprogrammierer » 16. Jun 2007 17:47

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.

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#13 Beitrag von Janka » 16. Jun 2007 20:45

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

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

Antworten