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

  • Är det precis vad du ' kör? Vad händer om du tar bort -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.)
  • Det löser faktiskt det, åtminstone för mig. Både dubbla och enkla citat bör ersättas av " respektive '.
  • Sm konst (?) citat! .. 🙂
  • Vad jag klistrade in var precis vad jag körde. Kan någon lägga upp ett svar?
  • Lägg upp felmeddelandet nästa gång du ställer frågan. Det sparar tid för alla.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *