Ich führe diesen Befehl aus, um alle Vorkommen von 'apple' in allen Dateien im Stammverzeichnis meiner Site zu finden und durch 'orange' zu ersetzen:
find ./ -exec sed -i 's/apple/orange/g' {} \;
Es werden jedoch keine Unterverzeichnisse durchlaufen.
Was ist falsch an diesem Befehl?
Hier sind einige Ausgabezeilen von find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
find ./
und veröffentlichen? Und das Verzeichnis strucuture bitte. edit: danke!Antworten:
Ihr Fund sollte so aussehen, um zu vermeiden, dass Verzeichnisnamen an sed gesendet werden:
quelle
sed -i 's/apple/orange/g'
umsed -i '' 's/apple/orange/g'
diese Arbeit zu machen.-i
nimmt ein Argument: die Erweiterung zum Speichern der temporären Datei. In GNU sed scheint es keinen Raum zwischen-i
und seinem Argument zu geben, aber in BSD sed gibt es ... also ist BSD-i '' 's/foo/bar/'
gleichbedeutend mit GNU-i 's/foo/bar/
.-e
funktioniert das Hinzufügen unter Mac OS nicht.touch a b c d e
gefolgt von dem obigen Befehl erzeugt eine Verzeichnisliste wie folgt :a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, da Fisch die leeren Klammern automatisch erweitert, wenn sie nicht angegeben werden.Für größere S & R-Aufgaben ist es besser und schneller, grep und xargs zu verwenden.
quelle
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
Das hat bei mir funktioniert:
quelle
*.php
ist wirklich falsch; Sie hatten einfach Glück, dass es im Startverzeichnis nicht erweitert wurde, weil Sie dort zufällig keine passenden Dateien hatten.quelle
Da es auch MacOS-Leute gibt, die diesen lesen (wie ich), hat der folgende Code für mich funktioniert (am 10.14)
Alle anderen Antworten mit
-i
und-e
funktionieren nicht unter macOS.Quelle
quelle
Ich denke, wir können dies mit einem einfachen Befehl in einer Zeile tun
Siehe diese Seite .
quelle
Unter Linux:
Wenn "sed" nicht funktioniert, versuchen Sie:
quelle