Uruchamiam to polecenie, aby znaleźć i zastąpić wszystkie wystąpienia „jabłka” słowem „pomarańczowy” we wszystkich plikach w katalogu głównym mojej witryny:
find ./ -exec sed -i 's/apple/orange/g' {} \;
Ale nie przechodzi przez podkatalogi.
Co jest nie tak z tym poleceniem?
Oto kilka linii wyników find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
find ./
i opublikować przykładowe wyniki? I proszę o strukturę katalogów. edycja: dzięki!Odpowiedzi:
Twoje znalezisko powinno wyglądać tak, aby uniknąć wysyłania nazw katalogów do sed:
źródło
sed -i 's/apple/orange/g'
, abysed -i '' 's/apple/orange/g'
do tej pracy.-i
przyjmuje argument: rozszerzenie użyte do zapisania pliku tymczasowego. W GNU sed wygląda na to, że nie ma między nimi spacji-i
, ale w BSD sed jest… więc BSD-i '' 's/foo/bar/'
jest równoważne z GNU-i 's/foo/bar/
.-e
nie działa w systemie Mac OS.touch a b c d e
następnie powyżej polecenie tworzy katalog z listą tak:a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, ponieważ ryba automatycznie rozszerza puste nawiasy klamrowe, jeśli nie są cytowane.W przypadku większych zadań s & r lepiej i szybciej jest używać grep i xargs, więc na przykład;
źródło
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
To działało dla mnie:
źródło
*.php
jest naprawdę niepoprawny; po prostu miałeś szczęście, że nie został rozwinięty w katalogu startowym, ponieważ nie było tam żadnych pasujących plików.źródło
Ponieważ są też ludzie macOS czytający ten (tak jak ja), poniższy kod działał dla mnie (10.14)
Wszystkie pozostałe odpowiedzi używają
-i
i-e
nie działają w systemie macOS.Źródło
źródło
Myślę, że możemy to zrobić za pomocą prostej linii w jednym wierszu
Sprawdź tę stronę .
źródło
W systemie Linux:
jeśli „sed” nie działa spróbuj:
źródło