Ik gebruik het volgende commando op mijn mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
en het lijkt geen effect te hebben.
Ik heb twee bestanden in de directory die eindigen op .java, die beide de foo hebben tekst erin. Mis ik iets?
EDIT: resultaten van verzoek om commentaar
[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 .
Reacties
Answer
Zorg er allereerst voor dat je gewone ascii gebruikt aanhalingstekens zoals "
en "
(ascii-codes 0x22
en 0x27
, respectievelijk) in shell-scripts, omdat het voorbeeld in je bericht niet-standaard aanhalingstekens bevat. Als je goed kijkt, zien ze er een beetje anders uit. Hoogstwaarschijnlijk is dit een kopieer- en plakfout van een RTF-document formaat zoals Word, OOWriter of zelfs een browservenster.
Aangezien u een Mac gebruikt, heeft u hoogstwaarschijnlijk de FreeBSD-implementatie van sed
, waarin het geval dat je het commando op deze manier moet schrijven:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(hier met +
in plaats van \;
om te voorkomen dat er één sed
aanroep per bestand wordt uitgevoerd).
In de FreeBSD-implementatie van sed
de vlag heeft een argument nodig: de extensie van een back-upbestand. Met -i .bak
zou de opdracht bijvoorbeeld een back-up maken van file1.txt
als file1.txt.bak
voordat de vervanging wordt uitgevoerd in het originele bestand. Een leeg argument gebruiken ""
betekent dat je geen back-upbestand gebruikt, dat lijkt te zijn wat je wilt.
Hetzelfde in de GNU (of NetBSD, OpenBSD , busybox) implementatie zou zijn:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Bedankt @bahamat en @Mikel en @ pieter-breed voor het verbeteren van mijn antwoord met uw opmerkingen.
Opmerkingen
- Wat doen de accolades?
- @ZaneHitchcox de accolades zijn tijdelijke aanduidingen voor de overeenkomende bestandsnaam
- wat ' s de
+
doen aan het einde? - @Anthony de
+
aan het einde beëindigt de lijst met argumenten van de-exec
optie. Het is vereist door de syntaxis van-exec
.
-exec
en alles erna verwijdert? Worden de namen van de Java-bestanden afgedrukt? (Ik ' maak me zorgen dat je ' slimme aanhalingstekens gebruikt in plaats van ASCII-aanhalingstekens.)"
en'
, respectievelijk.