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
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
.
-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.)"
și respectiv'
.