Jeg bruker følgende kommando på min mac:

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

og det ser ut til å ikke ha noen effekt.

Jeg har to filer i katalogen som ender på .java, som begge har foo tekst i dem. Mangler jeg noe?

EDIT: Resultater fra forespørsel 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 akkurat det du ' kjører? Hva om du fjerner -exec og alt etter det? Skriver det ut navnene på Java-filene? (Jeg ' er bekymret at du ' bruker smarte anførselstegn i stedet for ASCII-anførselstegn.)
  • Egentlig løser det det, i det minste for meg. Både doble og enkle anførselstegn bør erstattes av henholdsvis " og '.
  • Sm kunst (?) sitater! .. 🙂
  • Det jeg limte inn var akkurat det jeg kjørte. Kan noen legge ut et svar?
  • Neste gang vennligst legg feilmeldingen du ser når du stiller spørsmålet. Det vil spare tid for alle.

Svar

Først og fremst må du sørge for at du bruker vanlig ascii sitater som " og " (ascii-koder 0x22 og 0x27, henholdsvis) i skallskript, fordi eksemplet i innlegget ditt inneholder ikke-standardiserte anførselstegn. Hvis du ser nøye ut, ser de litt annerledes ut. Sannsynligvis er dette en kopi-lim-feil fra et rikt tekstdokument format som Word, OOWriter eller til og med et nettleservindu.

Siden du er på en Mac, har du sannsynligvis FreeBSD-implementeringen av sed, der tilfelle må du skrive kommandoen på denne måten:

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

(her bruker du + i stedet for \; for å unngå å kjøre en sed påkallelse per fil).

I FreeBSD-implementeringen av sed -flagget trenger et argument: utvidelsen av en sikkerhetskopifil. For eksempel med -i .bak vil kommandoen sikkerhetskopiere file1.txt som file1.txt.bak først før du utfører erstatningen i originalfilen. Å bruke et tomt argument "" betyr å ikke bruke en sikkerhetskopifil, som ser ut til å være det du vil ha.

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

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

Takk @bahamat og @Mikel og @ pieter-breed for å forbedre svaret mitt med dine kommentarer.

Kommentarer

  • Hva gjør de krøllete bukkene?
  • @ZaneHitchcox de krøllete bukkene er plassholdere for det samsvarte filnavnet
  • hva ' er + på slutten?
  • @Anthony + på slutten avslutter listen over argumenter for alternativet -exec. Det kreves av syntaksen til -exec.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *