• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

inhalte mehrere dateien verändern

bonzei

Newbie
nMorgen,

habe in verschiedenen Verzeichnissen mehrere Dateien mit dem Namen flash.php. In diesen will ich mit sed eine änderung vornehmen.

Ich habe hier einen hübschen Einzeiler zum umbenennen von mehreren Dateien, aber bekomme es leider nicht hin, das er auch mit sed funktioniert. Hier mal der Einzeiler

find . -type f -name "*.php" | while read file; do rename="${file%/*}"/flash.php ; mv "$file" "$rename"; done

Gruß Sascha
 
OP
bonzei

bonzei

Newbie
last mal hören ob das vernünfitg klingt Also:

Ich suche mit : find . -name flash.php

wende sed rauf an : sed s/360/550/

in ner pipe : Zeige geänderten Inhalt mit cat flash.php

Speichere das als flash.php : > flash.php

mv flash.php ???

Aber wie bekomme ich jetzt die Datei wieder dahin wo sie gefunden wurde ? Das Ergebniss von find in einer Variablen speichern ?!

Dann mit basename das flash.php entfernen z.B basename /home/test/flash.php und danach mv flash.php $variable ?

Oder so :

mit find suchen, ergebniss in Datei speichern, und sed s/360/550/ anwenden .

sed s/3607550/ < file in dem file würde dann stehen

file : variable=/home/sascha/flash.php

basename /home/sascha/flash.php mv flash.php $variable

:roll: :roll: :roll: Ich schnall das noch nicht so ganz, sorry
 

TeXpert

Guru
:arrow: sed hat "kleine" Probleme innerhalb der gleichen Datei zu ersetzen (vorsichtig formuliert)

:arrow: daraus folgt, mache ein sed in eine temp-Datei (man mktemp um einen eindeutigen Tempnamen zu generieren)

:arrow: Du hast den Namen (Quelle und Ziel) -> $file also nach dem Ändern wieder auf den ursprünglichen Namen zurück-moven


Code:
Schleife über alle Files:
  ersetze Zeichen in FILE speichere in Tempfile
  verschiebe Tempfile nach FILE

im Prinzip kannst Du Deinen 1-Zeiler problemlos verwenden :) musst halt nur die 3 Punkte oben als Aktion einbauen (meine Lösung gibts erst nach einem eigenen Versuch ;))

aber das Script von stka sah eigendlich gut aus... warum Du da ein Problem hast weiß ich nicht...[/code]
 
OP
bonzei

bonzei

Newbie
Yipiayeah,

find . -type f -name "*.php" | while read file; do sed s/360/550/ "$file" > /home/sascha/tmp/flash.php ; mv /home/sascha/tmp/flash.php "$file" ;done


Sauber oda ?

Sascha
 

TeXpert

Guru
bonzei schrieb:
Sauber oda ?
Sascha

:) geht doch... sauber bis zu einem gewissen Grad ;)

1/ Du setzt vorraus, dass /home/sascha/tmp/flash.php als Temp-File zur Verfügung steht.

mein Tipp war man mktemp und dann geht das so:

Code:
find . -type f -name "*.php" | while read file; do T=$(mktemp) ; sed -e 's/foo/bar/' "$file" > "$T" ; mv "$T" "$file" ; done
aber im Prinzip :) (OK, ich setzte jetzt eine nicht verwendete Variable 'T' vorraus ...)


2/ gewöhn Dir lieber an, paranoid zu quoten, d.h. auch sed entsprechend "zu schützen" --> sed -e 's/foo/bar/' insbesondere gehört ein -e vor die Operation...
 
Alternativ-Vorschlag:
Code:
find . -type f -name '*.php' -exec perl -p -i -e 's/360/550/g' {} \;
Zum Ersetzen in derselben Datei kann man perl nehmen, dann braucht man auch keinen Verschiebebahnhof mit temporären Dateien...
 
Oben