I „m folosind următoarea comandă pe mac-ul meu:

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

și se pare că nu are niciun efect.

Am două fișiere în director care se termină în .java, care au ambele foo text în ele. Îmi lipsește ceva?

EDIT: Rezultate de la solicitarea de comentarii

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

Comentarii

  • Este exact ceea ce ' re rulează? Ce se întâmplă dacă eliminați -exec și tot ce se află după acesta? Tipărește numele fișierelor Java? (Sunt ' m îngrijorat că ' folosiți ghilimele inteligente în loc de ghilimele ASCII.)
  • De fapt, asta o rezolvă, cel puțin pentru mine. Ar trebui înlocuite atât ghilimele duble, cât și cele simple. de " și respectiv '.
  • Sm citate de artă (?)! .. 🙂
  • Ce am lipit a fost exact ceea ce alergam. Poate cineva să posteze un răspuns?
  • Data viitoare, vă rugăm să postați mesajul de eroare pe care îl vedeți când puneți întrebarea. Acesta va economisi timp pentru toată lumea.

Răspuns

În primul rând, asigurați-vă că utilizați ascii regulate ghilimele precum " și " (coduri ascii 0x22 și 0x27, respectiv) în scripturile shell, deoarece exemplul din postarea dvs. conține caractere de ghilimă non-standard. Dacă priviți cu atenție, acestea arată un pic diferit. Cel mai probabil este o eroare de copiere-lipire dintr-un document cu text îmbogățit format ca Word, OOWriter sau chiar o fereastră de browser.

Deoarece sunteți pe un Mac, cel mai probabil aveți implementarea FreeBSD a sed, în care cazul trebuie să scrieți comanda în acest fel:

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

(aici folosind + în loc de \; pentru a evita executarea unei sed invocare pe fișier).

În implementarea FreeBSD a sed are nevoie de un argument: extensia unui fișier de rezervă. De exemplu, cu -i .bak comanda ar face backup file1.txt ca file1.txt.bak înainte de a efectua înlocuirea în fișierul original. Utilizarea unui argument gol "" înseamnă să nu folosiți un fișier de rezervă, care pare a fi ceea ce doriți.

Același lucru în GNU (sau NetBSD, OpenBSD , busybox) implementarea ar fi:

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

Vă mulțumim @bahamat și @Mikel și @ pieter-race pentru îmbunătățirea răspunsului meu cu comentariile dvs.

Comentarii

  • Ce fac acoladele?
  • @ZaneHitchcox acoladele sunt substituenți pentru numele de fișier potrivit
  • ce ' ce + face la sfârșit?
  • @Anthony + la final încheie lista argumentelor opțiunii -exec. Este cerut de sintaxa -exec.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *