Jag använder följande kommando på min mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
och det verkar inte ha någon effekt.
Jag har två filer i katalogen som slutar på .java, som båda har foo text i dem. Saknar jag något?
EDIT: Resultat från begäran om kommentarer
[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 .
Kommentarer
Svar
Kontrollera först och främst att du använder vanligt ascii citat som "
och "
(ascii-koder 0x22
och 0x27
, respektive) i skalskript, eftersom exemplet i ditt inlägg innehåller icke-standardiserade citattecken. Om du tittar noga ser de lite annorlunda ut. Det är troligtvis ett kopieringsfel från ett rich text-dokument format som Word, OOWriter eller till och med ett webbläsarfönster.
Eftersom du är på en Mac har du troligen FreeBSD-implementeringen av sed
, där om du måste skriva kommandot så här:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(här använder du +
istället för \;
för att undvika att köra en sed
anrop per fil).
I FreeBSD-implementeringen av sed
-flaggan behöver ett argument: förlängningen av en backupfil. Till exempel med -i .bak
skulle kommandot säkerhetskopiera file1.txt
som file1.txt.bak
innan du utför bytet i originalfilen. Att använda ett tomt argument ""
betyder att du inte använder en säkerhetskopia, vilket verkar vara vad du vill.
Samma sak i GNU (eller NetBSD, OpenBSD , upptagenbox) implementering skulle vara:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Tack @bahamat och @Mikel och @ pieter-breed för att förbättra mitt svar med dina kommentarer.
Kommentarer
- Vad gör de lockiga hakparenteserna?
- @ZaneHitchcox de lockiga hakparenteserna är platshållare för det matchade filnamnet
- vad ' s
+
gör i slutet? - @Anthony
+
i slutet avslutar listan med argument för alternativet-exec
. Det krävs av syntaxen för-exec
.
-exec
och allt efter det? Skriver det ut namnen på Java-filerna? (Jag ' är orolig att du ' använder smarta citat istället för ASCII-citat.)"
respektive'
.