Używam następującego polecenia na moim Macu:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
i wydaje się, że nie daje to żadnego efektu.
Mam dwa pliki w katalogu kończącym się na .java, z których oba mają foo tekst w nich. Czy coś mi brakuje?
EDYTUJ: Wyniki z żądania komentarzy
[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 .
Komentarze
Odpowiedź
Przede wszystkim upewnij się, że używasz zwykłego ascii cudzysłowy, takie jak "
i "
(kody ascii 0x22
i 0x27
) w skryptach powłoki, ponieważ przykład w Twoim poście zawiera niestandardowe znaki cudzysłowu. Jeśli przyjrzysz się uważnie, wyglądają one nieco inaczej. Najprawdopodobniej jest to błąd kopiowania i wklejania z dokumentu w formacie RTF format jak Word, OOWriter lub nawet okno przeglądarki.
Ponieważ korzystasz z komputera Mac, najprawdopodobniej masz we FreeBSD implementację sed
, w której w przypadku, gdy musisz napisać polecenie w ten sposób:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(tutaj używając +
zamiast , aby uniknąć uruchamiania jednego wywołania sed
na plik).
We FreeBSD implementacja sed
flaga wymaga argumentu: rozszerzenia pliku kopii zapasowej. Na przykład w przypadku -i .bak
polecenie utworzy kopię zapasową file1.txt
jako file1.txt.bak
przed wykonaniem zamiany w oryginalny plik. Używanie pustego argumentu ""
oznacza nieużywanie pliku kopii zapasowej, co wydaje się być tym, czego chcesz.
To samo w GNU (lub NetBSD, OpenBSD , busybox) byłaby następująca:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Dziękuję @bahamat i @Mikel i @ pieter-breed za ulepszenie mojej odpowiedzi za pomocą twoich komentarzy.
Komentarze
- Co robią nawiasy klamrowe?
- @ZaneHitchcox Nawiasy klamrowe są symbolami zastępczymi dopasowanej nazwy pliku
- co ' czy
+
zrobi na końcu? - @Anthony the
+
na końcu kończy listę argumentów opcji-exec
. Jest to wymagane przez składnię-exec
.
-exec
i wszystko po nim? Czy drukuje nazwy plików Java? (Nie ' martwię się że ' używasz inteligentnych cudzysłowów zamiast znaków ASCII.)"
i'
, odpowiednio.