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

  • Czy to jest dokładnie to, co ' re działa? Co się stanie, jeśli usuniesz -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.)
  • Właściwie to rozwiązuje problem, przynajmniej dla mnie. Zarówno podwójne, jak i pojedyncze cudzysłowy powinny być zastąpione przez " i ', odpowiednio.
  • Sm sztuka (?) cytaty! .. 🙂
  • To, co wkleiłem, było dokładnie tym, co uruchomiłem. Czy ktoś może opublikować odpowiedź?
  • Następnym razem opublikuj komunikat o błędzie, który widzisz, zadając pytanie. Zaoszczędzi to czas wszystkim.

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *