sed mit Liste von Dateien

B

beaucoup

Grünschnabel
Hi,

ich möchte ein Skript schreiben mit dem ich nach einem Text in mehreren Dateien suchen kann und diesen durch einen neuen ersetzen.

Bin auch schon soweit dass ich mit "grep -ril meintext * " alle Dateien bekomm in denen mein Text steht.

Mit "sed 's/alterText/neuerText/g' Dateiname" kann ich in einer Datei meinen Text suchen und ersetzen.

Wie bekomme ich das jetzt für alle Dateien aus meiner Liste hin?

Ich bekomme es nicht hin eine Schleife zu basteln mit der ich immer eine Zeile aus meim grep Befehl nehme um den sed Befehl auszuführen.

Beschäftige mich erst seit ca. 1 Woche mit Linux Shell und Co, bin also für jede Hilfe/Erklärung dankbar.:)

Vielen Dank für eure Hilfe!

beaucoup
 
Hallo beaucoup

So etwas sollte hinhaun:
Code:
for i in $(grep -ril deintext *); do sed 's/altertext/neuertext/g' $i > mod_$i;done
...

Damit bekommst Du aber Probleme, falls die Filenamen Leerzeichen enthalten. Besser geeignet ist

Code:
grep -ril deintext * | while read file; do sed ... $file; done

oder eine Lösung mit xargs.

Gruss, Xanti
 
Damit bekommst Du aber Probleme, falls die Filenamen Leerzeichen enthalten. Besser geeignet ist
Code:
grep -ril deintext * | while read file; do sed ... $file; done
Gruss, Xanti
Danke für den Hinweis. Wieder etwas wichtiges gelernt... (Denk immer an Filenamen mit Leerzeichen) ;)
Kannst du mir sagen, warum das so ist, kann 'read' einfach von Haus aus mit Leerzeichen in Filenamen umgehen?

Und wie stehts mit dem Quoting? Bei mir klappts nur wenn ich wie folgt quote... (also im Falle von Leerzeichen)
Code:
grep -ril deintext * | while read file; do sed 's/deintext/meintext/g' "$file" > "mod_$file"; done

Dank und Gruss
d22
 
Hi

vielen Dank für eure Antworten. Jetzt hab ich noch eine Frage werden die Datein dann auch mit geändertem Text gespeichert oder müsste ich dann noch ein
Code:
>$file
hinten anhängen?

beaucoup

Wer lesen kann is klar im Vorteil ....
Aber trotzdem wenn ich nur ein >$file anhänge wird meine Ursprungsdatei überschrieben oder?
 
...

Und wie stehts mit dem Quoting? Bei mir klappts nur wenn ich wie folgt quote... (also im Falle von Leerzeichen)
Code:
grep -ril deintext * | while read file; do sed 's/deintext/meintext/g' "$file" > "mod_$file"; done

Stimmt, irgendwas übersieht man immer ;)

Hi

vielen Dank für eure Antworten. Jetzt hab ich noch eine Frage werden die Datein dann auch mit geändertem Text gespeichert oder müsste ich dann noch ein
Code:
>$file
hinten anhängen?

beaucoup

Wer lesen kann is klar im Vorteil ....
Aber trotzdem wenn ich nur ein >$file anhänge wird meine Ursprungsdatei überschrieben oder?

Schau Dir mal die sed-Option -i an. Dein >$file funktioniert nicht, Du müsstest mit einer temporären Datei arbeiten:

Code:
>"$file.tmp" && mv "$file.tmp" "$file"
 
Zuletzt bearbeitet:
Kannst du mir sagen, warum das so ist, kann 'read' einfach von Haus aus mit Leerzeichen in Filenamen umgehen?

Und wie stehts mit dem Quoting? Bei mir klappts nur wenn ich wie folgt quote... (also im Falle von Leerzeichen)
Code:
grep -ril deintext * | while read file; do sed 's/deintext/meintext/g' "$file" > "mod_$file"; done

Dank und Gruss
d22
Zu deiner Frage:
- read ist es völlig egal, was da in die Variable gefüllt wird.
- read weiß nicht, ob das Werte oder Dateinamen sind.
- read trennt genauso am default Trennzeichen ($IFS).
- read füllt die Variablen mit den Werten, und wenn mehr Werte als Variablen kommen, landet alles in der letzten Variable.

Diese Eigenschaft nutzt man aus, indem man nur eine Variable vereinbart. Die erste und hier auch letzte Variable bekommt also alles.
Deshalb funktioniert das auch mit Leerzeichen.

Gruß Wolfgang
 
Vielen Dank für die Hilfe hat super funktioniert!

Gruß beaucoup
 
@Wolfgang
Danke für die Erklärung!

Gruss
d22
 
Hallo
Eine Frage stellt sich mir aber doch noch:
Warum brauchst du hier grep?
sed ersetzt doch ohnehin nur dort den Text, wo er vorkommt.
:think:
Also werden bei dir alle Dateien von grep durchsucht, und von sed nocheinmal.
:think:
Eine find Ausgabe in die Pipe wär hier wohl performanter.
Gruß Wolfgang
 
Die Frage ist gut ;)

Wie gesagt ich habe ein profundes eine-Woche-Linux-Wissen ;)

Bin über jeden Ratschlag dankbar!

Gruß beaucoup
 

Ähnliche Themen

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

sed - Bitte um Unterstützung

Keine grafische Oberfläche (Debian Installation)

HandbrakeCLI Shell Skript

Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED

Zurück
Oben