Je « m en utilisant la commande suivante sur mon mac:

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

et cela semble navoir aucun effet.

Jai deux fichiers dans le répertoire qui se terminent par .java, qui ont tous les deux le toto texte dedans. Est-ce que je manque quelque chose?

EDIT: Résultats de la demande de commentaires

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

Commentaires

  • Est-ce exactement ce que vous ' re en cours dexécution? Que faire si vous supprimez -exec et tout ce qui suit? Est-ce quil affiche les noms des fichiers Java? (Je ' suis inquiet que vous ' utilisez des guillemets intelligents au lieu de guillemets ASCII.)
  • En fait, cela résout le problème, du moins pour moi. Les guillemets simples et doubles doivent être remplacés par " et ', respectivement.
  • Sm citations dart (?)! .. 🙂
  • Ce que jai collé était exactement ce que je courais. Quelquun peut-il publier une réponse?
  • La prochaine fois, veuillez publier le message derreur que vous voyez lorsque vous posez la question. Cela fera gagner du temps à tout le monde.

Réponse

Tout d’abord, assurez-vous que vous utilisez un ascii classique des guillemets tels que " et " (codes ascii 0x22 et 0x27, respectivement) dans les scripts shell, car lexemple de votre message contient des guillemets non standard. Si vous regardez de plus près, ils semblent un peu différents. Il sagit probablement dune erreur de copier-coller à partir dun document de texte enrichi comme Word, OOWriter ou même une fenêtre de navigateur.

Puisque vous êtes sur un Mac, vous avez très probablement l’implémentation FreeBSD de sed, dans laquelle si vous devez écrire la commande de cette façon:

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

(ici en utilisant + au lieu de \; pour éviter dexécuter un appel sed par fichier).

Dans limplémentation FreeBSD de sed le nécessite un argument: lextension dun fichier de sauvegarde. Par exemple, avec -i .bak, la commande sauvegardera file1.txt sous file1.txt.bak avant deffectuer le remplacement dans le fichier dorigine. Utiliser un argument vide "" signifie ne pas utiliser de fichier de sauvegarde, ce qui semble être ce que vous voulez.

La même chose dans GNU (ou NetBSD, OpenBSD , busybox) serait:

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

Merci @bahamat et @Mikel et @ pieter-race pour avoir amélioré ma réponse avec vos commentaires.

Commentaires

  • Que font les accolades?
  • @ZaneHitchcox les accolades sont des espaces réservés pour le nom de fichier correspondant
  • quoi ' est-ce que + fait à la fin?
  • @Anthony le + à la fin termine la liste des arguments de loption -exec. Il est requis par la syntaxe de -exec.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *