Jeg bruger den følgende kommando på min mac:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \; 

og det ser ud til at have nogen effekt.

Jeg har to filer i biblioteket, der ender på .java, som begge har foo tekst i dem. Mangler jeg noget?

EDIT: Resultater fra anmodning 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

  • Er det netop det, du ' kører? Hvad hvis du fjerner -exec og alt efter det? Udskriver det navnene på Java-filerne? (Jeg ' er bekymret at du ' bruger smarte anførselstegn i stedet for ASCII-anførselstegn.)
  • Faktisk løser det det, i det mindste for mig. Både dobbelt og enkelt anførselstegn skal erstattes af henholdsvis " og '.
  • Sm kunst (?) citater! .. 🙂
  • Det, jeg klistrede, var præcis, hvad jeg kørte. Kan nogen sende et svar?
  • Næste gang bedes du sende den fejlmeddelelse, du ser, når du stiller spørgsmålet. Det sparer tid for alle.

Svar

Først og fremmest skal du sørge for at bruge regelmæssig ascii citater som " og " (ascii-koder 0x22 og 0x27 i shell-scripts, fordi eksemplet i dit indlæg indeholder ikke-standardiserede anførselstegn. Hvis du ser nøje ud, ser de lidt anderledes ud. Det er sandsynligvis en kopi-indsæt-fejl fra et rich text-dokument format som Word, OOWriter eller endda et browservindue.

Da du er på en Mac, har du sandsynligvis FreeBSD-implementeringen af sed, hvor hvis du skal skrive kommandoen på denne måde:

find . -name "*.java" -exec sed -i "" s/foo/bar/g {} + 

(her ved hjælp af + i stedet for \; for at undgå at køre en sed påkald pr. Fil).

I FreeBSD-implementeringen af sed -flag har brug for et argument: udvidelsen af en sikkerhedskopifil. For eksempel med -i .bak vil kommandoen tage backup af file1.txt som file1.txt.bak først inden udskiftning i den originale fil. Brug af et tomt argument "" betyder ikke at bruge en sikkerhedskopifil, hvilket synes at være det, du vil have.

Det samme i GNU (eller NetBSD, OpenBSD , busybox) implementering ville være:

find . -name "*.java" -exec sed -i s/foo/bar/g {} + 

Tak @bahamat og @Mikel og @ pieter-breed for at forbedre mit svar med dine kommentarer.

Kommentarer

  • Hvad gør de krøllede seler?
  • @ZaneHitchcox de krøllede seler er pladsholdere for det matchede filnavn
  • hvad ' er + i slutningen?
  • @Anthony + i slutningen afslutter listen over argumenter for indstillingen -exec. Det kræves af syntaksen for -exec.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *