Z powodzeniem użyłem następującego sed
polecenia do wyszukiwania / zamiany tekstu w systemie Linux:
sed -i 's/old_link/new_link/g' *
Jednak gdy wypróbuję to w systemie Mac OS X, otrzymuję:
„polecenie c oczekuje \ po którym następuje tekst”
Myślałem, że mój Mac działa z normalną powłoką BASH. Co tam?
EDYTOWAĆ:
Według @High Performance wynika to z tego, że Mac sed
ma inny smak (BSD), więc moje pytanie brzmi: w jaki sposób mam replikować to polecenie w BSD sed
?
EDYTOWAĆ:
Oto faktyczny przykład, który powoduje:
sed -i 's/hello/gbye/g' *
sed
widzi „c” w danych jako polecenie. Czy używasz zmiennej? Proszę zamieścić coś, co bardziej odzwierciedla rzeczywiste polecenie i niektóre przetwarzane dane. W ten sposób można uzyskać prostą demonstrację tego błęduecho x | sed c
.Odpowiedzi:
Jeśli skorzystasz z tej
-i
opcji, musisz podać rozszerzenie dla swoich kopii zapasowych.Jeśli masz:
Polecenie (zwróć uwagę na brak miejsca między
-i
i''
a,-e
aby działało na nowych wersjach Maca i GNU):Utwórz 2 pliki kopii zapasowych, takie jak:
Nie ma przenośnego sposobu na uniknięcie tworzenia kopii zapasowych plików, ponieważ nie można znaleźć kombinacji komend sed, która działa we wszystkich przypadkach:
sed -i -e ...
- nie działa w systemie OS X, ponieważ tworzy-e
kopie zapasowesed -i'' -e ...
- nie działa w systemie OS X 10.6, ale działa w wersji 10.9+sed -i '' -e ...
- nie działa na GNUUwaga: Ponieważ na wszystkich platformach nie działa polecenie sed, możesz spróbować użyć innego polecenia, aby uzyskać ten sam wynik.
Na przykład,
perl -i -pe's/old_link/new_link/g' *
źródło
sed
możliwe, NIE dostarczyłeś przyrostka. Sufiks kopii zapasowej tos/old_link/new_link/g
. Następnym argumentem po tym są polecenia edycji. Ponieważ interpretował polecenia jako nazwę kopii zapasowej, następnie wziął pierwszą nazwę pliku jako polecenie edycji, ale nie były one prawidłowe.sed -i '' -e ...
?sed -i'' -e
wydaje się nie działać zgodnie z oczekiwaniami na Mac 10.14Uważam, że w systemie OS X, gdy używasz -i, wymagane jest rozszerzenie plików kopii zapasowej . Próbować:
Korzystanie z GNU
sed
rozszerzenie jest opcjonalne .źródło
Działa to zarówno z wersjami sed: GNU, jak i BSD:
lub z kopią zapasową:
Zwróć uwagę na brak miejsca po
-i
opcji! (Niezbędne dla GNU sed)źródło
rm
polecenie, aby je usunąć.sed -i'' ...
=>sed -i '' ...
Miałem ten sam problem na Macu i rozwiązałem go za pomocą
brew
:i użyj jako
możesz ustawić równie dobrze
sed
jako alias nagsed
(jeśli chcesz):źródło
Lub możesz zainstalować wersję GNU sed na swoim Macu, zwaną gsed, i używać go przy użyciu standardowej składni Linuksa.
W tym celu zainstaluj
gsed
za pomocą portów (jeśli go nie masz, pobierz go na stronie http://www.macports.org/ ), uruchamiającsudo port install gsed
. Następnie możesz biegaćsed -i 's/old_link/new_link/g' *
źródło
gnu-sed
Twój komputer Mac rzeczywiście obsługuje powłokę BASH, ale jest to raczej kwestia tego, z którą implementacją sed masz do czynienia. Na Macu sed pochodzi z BSD i subtelnie różni się od sed, który można znaleźć na typowym Linux-ie. Proponuję ci
man sed
.źródło
Odpowiedź Sinetrisa jest słuszna, ale używam tego z
find
poleceniem, aby dokładniej określić, jakie pliki chcę zmienić. Ogólnie powinno to działać (testowane na systemie OSX/bin/bash
):Ogólnie rzecz biorąc, stosowanie
sed
bezfind
w złożonych projektach jest mniej wydajne.źródło
-exec
jest bardzo miła! Zastanawiam się tylko, czy cięcie w końcu naprawdę jest potrzebne\
The;
got interpretowane przez powłokę kiedy próbowałem takiegoStworzyłem funkcję do obsługi
sed
różnicy między MacOS (testowanym na MacOS 10.12) a innym systemem operacyjnym:Stosowanie:
Gdzie:
,
jest ogranicznikiem's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
jest wzorem"./mysql/.env"
to ścieżka do plikuźródło
Oto jak zastosować zmienne środowiskowe do pliku szablonu (bez potrzeby tworzenia kopii zapasowej).
1. Utwórz szablon za pomocą {{FOO}} do późniejszego zastąpienia.
2. Zastąp {{FOO}} zmienną FOO i wyślij do nowego pliku foo.conf
Działa zarówno z macOS 10.12.4, jak i Ubuntu 14.04.5
źródło
Jak wskazują inne odpowiedzi, nie ma sposobu, aby używać sed w przenośny sposób w OS X i Linux bez tworzenia kopii zapasowych. Więc zamiast tego użyłem tego Rubinowego jedno-liniowego:
W moim przypadku musiałem wywołać go z
rake
zadania (tj. W skrypcie Ruby), więc użyłem tego dodatkowego poziomu cytowania:źródło
Działa zarówno na BSD, jak i Linuksie
źródło
e
dołączonym