I ”m käyttämällä seuraavaa komentoa Macissani:

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

ja sillä ei näytä olevan vaikutusta.

Minulla on kaksi tiedostoa hakemistossa, jotka päättyvät .java-tiedostoon, joilla molemmilla on foo teksti niissä. Puuttuuko minusta jotain?

MUOKKAA: Tulokset kommenttipyynnöstä

[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 . 

Kommentit

  • Oletteko juuri sitä ' uudelleen käynnissä? Entä jos poistat -exec ja kaiken sen jälkeen? Tulostaako se Java-tiedostojen nimet? (Olen ' huolissani ' käytät älykkäitä lainausmerkkejä ASCII-lainausten sijaan.)
  • Itse asiassa se ratkaisee, ainakin minulle. Sekä kaksois- että yksittäiset lainaukset tulisi korvata kirjoittanut " ja '.
  • Sm taide (?) lainauksia! .. 🙂
  • Liitin juuri sen, mitä juoksin. Voiko joku lähettää vastauksen?
  • Lähetä seuraavan kerran virheilmoitus, jonka näet, kun kysyt kysymystä. Se säästää aikaa kaikille.

Vastaa

Varmista ensinnäkin, että käytät tavallisia ascii-tiedostoja lainaukset, kuten " ja " (ascii-koodit 0x22 ja 0x27, vastaavasti) shell-komentosarjoissa, koska viestisi esimerkki sisältää epätyypillisiä lainausmerkkejä. Jos katsot tarkkaan, ne näyttävät hieman erilaisilta. Todennäköisesti tämä on kopioi-liitä-virhe rikkaasta tekstidokumentista muodossa, kuten Word, OOWriter tai jopa selainikkuna.

Koska olet Macissa, sinulla on todennäköisesti FreeBSD-toteutus sed, jossa tapauksessa sinun on kirjoitettava komento tällä tavalla:

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

(tässä käytetään + -tunnusta \;, jotta vältetään yhden sed -kutsun suorittaminen tiedostoa kohden).

FreeBSD: n sed -lippu tarvitsee argumentin: varmuuskopiotiedoston laajennuksen. Esimerkiksi komennolla -i .bak komento varmuuskopioi file1.txt nimellä file1.txt.bak ensin ennen korvaamisen suorittamista alkuperäisen tiedoston. Tyhjän argumentin käyttäminen "" tarkoittaa, että varmuuskopiotiedostoa ei käytetä, mikä näyttää olevan haluamasi.

Sama asia GNU: ssa (tai NetBSD, OpenBSD , busybox) toteutus olisi:

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

Kiitos @bahamat ja @Mikel ja @ pieter-breed vastauksen parantamiseksi kommenteillasi.

Kommentit

  • Mitä kiharat ovat?
  • @ZaneHitchcox kiharat ovat vastaavan tiedostonimen paikkamerkkejä
  • mitä ' s mitä + tekevät lopussa?
  • @Anthony + lopussa päättää -exec -vaihtoehdon argumenttiluettelon. Se vaaditaan -exec -syntaksissa.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *