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

  • Is dat precies wat je ' wordt uitgevoerd? Wat als u de -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.)
  • Eigenlijk lost dat het op, althans voor mij. Zowel dubbele als enkele aanhalingstekens moeten worden vervangen door " en ', respectievelijk.
  • Sm kunst (?) citaten! .. 🙂
  • Wat ik plakte, was precies wat ik aan het uitvoeren was. Kan iemand een antwoord plaatsen?
  • Plaats de volgende keer de foutmelding die u ziet als u de vraag stelt. Het bespaart iedereen tijd.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *