Używam następującego polecenia na moim komputerze Mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
i wydaje się, że nie ma żadnego efektu.
Mam dwa pliki w katalogu, które kończą się na .java, które zawierają tekst foo. Czy coś brakuje?
EDYCJA: Wyniki z prośby o komentarze
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .
-exec
i wszystko po nim? Czy drukuje nazwy plików Java? (Martwię się, że używasz inteligentnych cytatów zamiast cytatów ASCII.)"
i'
.Odpowiedzi:
Przede wszystkim upewnij się, że używasz regularnych cytatów ascii, takich jak
"
i'
(odpowiednio kody ascii0x22
i0x27
) w skryptach powłoki, ponieważ przykład w twoim poście zawiera niestandardowe znaki cytowania. Jeśli przyjrzysz się uważnie, wyglądają nieco inaczej. Najprawdopodobniej jest to błąd kopiowania i wklejania z formatu dokumentu tekstu sformatowanego, takiego jak Word, OOWriter, a nawet okno przeglądarki.Ponieważ jesteś na komputerze Mac, najprawdopodobniej masz implementację FreeBSD
sed
, w którym to przypadku musisz napisać polecenie w ten sposób:(tutaj,
+
zamiast używać\;
jednegosed
wywołania na plik).W realizacji FreeBSD z
sed
tej-i
flagi potrzebuje argument: rozszerzenie pliku kopii zapasowej. Na przykład za-i .bak
pomocą polecenia utworzono kopię zapasowąfile1.txt
jakofile1.txt.bak
pierwszą przed wykonaniem zamiany w oryginalnym pliku. Użycie pustego argumentu''
oznacza nieużywanie pliku kopii zapasowej, który wydaje się być tym, czego chcesz.To samo w implementacji GNU (lub NetBSD, OpenBSD, busybox) to:
Dziękuję @bahamat i @Mikel i @ pieter-breed za ulepszenie mojej odpowiedzi w twoich komentarzach.
źródło