I “m a következő parancs használatával a mac-on:

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

és úgy tűnik, hogy nincs hatása.

A könyvtárban két fájl van, amelyek .java végződésűek, és mindkettőjüknek van foo szöveg bennük. Hiányzik valami?

SZERKESZTÉS: A megjegyzések kérésének eredményei

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

Megjegyzések

  • Pontosan ez az, amit ' re fut? Mi van, ha eltávolítja a -exec fájlt és mindent utána? Kinyomtatja a Java fájlok nevét? (aggódtam ' hogy ' intelligens idézőjeleket használ az ASCII idézetek helyett.)
  • Valójában ez megoldja, legalábbis számomra. A kettős és az egyes idézőjeleket is helyettesíteni kell " és ' által.
  • Sm művészet (?) idézetek! .. 🙂
  • Amit beillesztettem, pontosan azt futottam. Lehet valaki választ küldeni?
  • Legközelebb tegye fel a hibaüzenetet, amelyet a kérdés feltevésekor lát. Mindenki számára időt takarít meg.

Válasz

Először is győződjön meg róla, hogy a szokásos ascii-t használja. olyan idézetek, mint " és " (ascii kódok 0x22 és 0x27, ill.) a shell szkriptekben, mert a bejegyzésben szereplő példa nem szabványos idézőjeleket tartalmaz. Ha jól megnézed, akkor kissé másképp néznek ki. Valószínűleg ez egy copy-paste hiba egy gazdag szöveges dokumentumból formátum, például Word, OOWriter vagy akár egy böngészőablak.

Mivel Ön Mac számítógépet használ, valószínűleg a sed FreeBSD implementációja van, amelyben esetben a parancsot így kell megírnod:

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

(itt a + szót használd a \; egy sed fájlonkénti meghívás futtatásának elkerülése érdekében.

A sed a jelzőnek argumentumra van szüksége: egy biztonsági másolat fájl kiterjesztésére. Például a -i .bak paranccsal a parancs először file1.txt néven biztonsági másolatot készít file1.txt.bak néven, mielőtt elvégezné a az eredeti fájlt. Üres argumentum használata "" azt jelenti, hogy nem használ biztonsági mentési fájlt, ami úgy tűnik, amit szeretnél.

Ugyanez a GNU-ban (vagy NetBSD-ben, OpenBSD-ben) , busybox) megvalósítása a következő lenne:

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

Köszönöm @bahamat és @Mikel és @ pieter-breed , hogy javítsam válaszaimat kommentjeivel.

Megjegyzések

  • Mit csinálnak a göndör zárójelek?
  • @ZaneHitchcox, a göndör zárójelek a megfelelő fájlnév helyőrzői
  • mi ' s a + a végén?
  • @Anthony a + a végén befejezi a -exec opció argumentumlistáját. A -exec szintaxisa megköveteli.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük