Global Search and Replace
-
Hi.
Ich suche etwas um in allen Dateien ab dem momentanen Verzeichnis einen String zu suchen und den dann zu ersetzen.Also für das Suchen hab ich schon was, aber vielleicht kann mir da einer noch was weiterhelfen und verbessern, bin ein Linux neuling.
Das ganze soll später dann in ein Shell Script.
Zum suchen hatte ich das:
find -type f | xargs grep String
Oder gibt es da eine bessere Methode.
MfG
Oliver
-
so sollte das gehen. Bin mir aber nicht sicher, teste das vorher lieber
> find -type f -exec sed -i "s/<string>/<ersetzen>/" {} ;
-
Ohne das probiert zu haben: Fehlt da nicht am Ende des sed-Kommandos ein g? ("s/<string>/<ersetzen>/g")
-
nman schrieb:
Ohne das probiert zu haben: Fehlt da nicht am Ende des sed-Kommandos ein g? ("s/<string>/<ersetzen>/g")
Mir ist auch noch nicht klar, wie find das passende Verzeichnis erraten soll (jaja, GNU-find kann das alles), und wo genau da irgendwas umbenannt wird. Wenn man diesen Ausdruck dann in die Shell eintippt, wird sich find auch noch über ein mangelndes Semikolon beklagen, nehme ich an. Und was macht das -i bei sed? Auch eine GNU-Option?
-
@Daniel E.
Die -i Option bearbeitet die Dateien. Scheint aber wirklich eine GNU-Extension zu sein und die Angabe des Verzeichniss hab ich auch vergessen (aber dafür hat man ja GNU-find ;))> find . -type f -exec sed -i "s/a/b/g" {} \;
nun aber
Wie man das POSIX kompatibel macht, da hab ich aber leider keine vernünftige Idee. Aber unter Linux wird er ja eh GNU-find und GNU-sed haben.
-
kingruedi schrieb:
Wie man das POSIX kompatibel macht, da hab ich aber leider keine vernünftige Idee.
$ find . -type f -print | while read o; do n=`echo $o | sed 's/expr1/expr2/g'` mv "$o" "$n" done
(Falls keine Zeilenumbrüche usw, blabla)
-
@DanielE.
ging es nicht um den Inhalt der Datei und nicht um die Dateinamen?Ich suche etwas um in allen Dateien ab dem momentanen Verzeichnis einen String zu suchen und den dann zu ersetzen.
> find . -type f -print | while read file; do TMPFILE=`mktemp /tmp/tmp.XXXXXX` || exit 1 sed "s/expr1/expr2/g" "$file" > $TMPFILE mv "$file" $TMPFILE done
-
kingruedi schrieb:
@DanielE.
ging es nicht um den Inhalt der Datei und nicht um die Dateinamen?Ach soo. Und ich habe mich schon gewundert, was für absonderliche Funktionalität doch in so einem sed stecken kann...
-
Danke erstmal für die Antworte, haben mir einiges geholfen.
Aber vielleicht weiß hier ja noch einer wie man überprüfen kann, ob es beim sed zu einem Fehler gekommen ist.MfG
Oliver
-
Danke erstmal für die Antworte, haben mir einiges geholfen.
Aber vielleicht weiß hier ja noch einer wie man überprüfen kann, ob es beim sed zu einem Fehler gekommen ist.MfG
Oliver