W powłoce Linuksa następujące polecenie będzie rekurencyjnie przeszukiwać i zamieniać wszystkie wystąpienia „to” na „tamto” (nie mam przed sobą powłoki Linuksa, ale powinno to zrobić).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
Jak będzie wyglądać podobne polecenie w systemie OSX?
apple.stackexchange.com
ponieważ nie jest wystarczająco ogólny dla Linuksa ani dla wszystkich programistów.Odpowiedzi:
OS X używa mieszanki narzędzi BSD i GNU, więc najlepiej zawsze sprawdzaj dokumentację (chociaż miałem ją, która
less
nawet nie była zgodna ze stroną podręcznika OS X):https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed przyjmuje argument after
-i
jako rozszerzenie dla kopii zapasowych. Podaj pusty ciąg (-i ''
) bez kopii zapasowych.Należy wykonać następujące czynności:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
To
-type f
po prostu dobra praktyka; sed będzie narzekał, jeśli podasz mu katalog lub coś takiego.-exec
jest lepszy odxargs
; nie musisz się tym przejmować-print0
. Znak{} +
na końcu oznacza, żefind
doda wszystkie wyniki jako argumenty do jednego wystąpienia wywoływanego polecenia, zamiast ponownego uruchamiania go dla każdego wyniku. (Jedynym wyjątkiem jest sytuacja, gdy maksymalna liczba argumentów wiersza poleceń dozwolona przez system operacyjny zostanie naruszona; w takim przypadkufind
uruchomi więcej niż jedną instancję).źródło
%
znaku:sed "s%localhost/site%blah/blah%"
. Inną alternatywą jest interpretacja odwrotnego ukośnika-uniknąć segregatorased "s/localhost\/site/blah\/blah/"
.illegal byte sequence
błąd? jeśli tak, spróbuj:,LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
to zadziałało./g
w wielu przypadkach, takich jakLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
W przypadku komputerów Mac bardziej podobne podejście byłoby następujące:
źródło
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Jako alternatywne rozwiązanie używam tego w systemie Mac OSX 10.7.5
Zasługa: odpowiedź Todd Cesere za
źródło
W systemie Mac OSX 10.11.5 działa to dobrze:
źródło
Żadne z powyższych nie działa na OSX.
Wykonaj następujące czynności:
źródło
Wersja działająca zarówno w systemie Linux, jak i Mac OS X (po dodaniu
-e
przełącznika dosed
):źródło
export LC_CTYPE=C && export LANG=C
Za każdym razem, gdy wpisuję to polecenie, zawsze wydaje mi się, że go zawiązuję lub zapominam o fladze. Stworzyłem Gist na github na podstawie odpowiedzi TaylanUB, która zastępuje znalezisko globalne z bieżącego katalogu. Dotyczy to tylko systemu Mac OSX.
https://gist.github.com/nateflink/9056302
To miłe, ponieważ teraz po prostu otwieram terminal i kopiuję:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s „find-a-url.com” „replace-a-url.com”
Możesz uzyskać dziwne błędy sekwencji bajtów, więc oto pełny kod:
źródło
To jest mój wykonalny. w systemie Mac OS X 10.10.4
Powyższe użycie find zmieni pliki, które nie zawierają szukanego tekstu (doda nową linię na końcu pliku), czyli jest gadatliwy.
źródło
Jeśli używasz terminala zsh, możesz używać magii wieloznacznej:
sed -i "" "s/search/high-replace/g" *.txt
źródło
Użyłem tego formatu - ale ... Okazało się, że musiałem uruchomić go trzy lub więcej razy, aby faktycznie zmienić każdą instancję, co wydało mi się wyjątkowo dziwne. Uruchomienie go raz zmieniłoby niektóre w każdym pliku, ale nie wszystkie. Uruchomienie dokładnie tego samego ciągu dwa-cztery razy spowoduje przechwycenie wszystkich instancji.
źródło
g
na końcu, w przeciwnym razie zastępuje tylko pierwsze wystąpieniethistext
w linii. Więc twoje wyrażenie regularne powinno wyglądać taks/thistext/newtext/g
https://bitbucket.org/masonicboom/serp to narzędzie go (tj. wieloplatformowe), przetestowane na OSX, które wykonuje cykliczne przeszukiwanie i zastępowanie tekstu w plikach w danym katalogu i potwierdza każdą zamianę. Jest nowy, więc może być wadliwy.
Sposób użycia wygląda następująco:
źródło
Więcej informacji znajdziesz tutaj .
źródło
Polecenie na OSX powinno być dokładnie takie samo, jak w systemie Unix pod ładnym interfejsem użytkownika.
źródło
-print0
dodać dofind
flag i-0
doxargs
flag.-exec sed -i s/this/that/g {} \+
zamiast-print
i xargsxargs
może spowodować wyświetlenie rozdzielanego spacjami „./jacobus” jako pliku do przekazaniased
, a następnie „R.txt” , z których żaden nie istnieje.można po prostu powiedzieć $ PWD zamiast „.”
źródło