web-dev-qa-db-fra.com

find & sed (rechercher et remplacer)

J'utilise la commande suivante sur mon mac:

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

et cela semble n'avoir aucun effet.

J'ai deux fichiers dans le répertoire qui se terminent par .Java, qui contiennent tous les deux le texte foo. Suis-je en train de manquer 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 .
34
Amir Afghani

Tout d'abord, assurez-vous que vous utilisez des guillemets ascii réguliers comme " et ' (codes ascii 0x22 et 0x27, respectivement) dans les scripts Shell, car l'exemple de votre message contient des guillemets non standard. Si vous regardez attentivement, ils ont l'air un peu différents. Il s'agit très probablement d'une erreur de copier-coller provenant d'un format de document texte riche comme Word, OOWriter ou même d'une fenêtre de navigateur.

Puisque vous êtes sur un Mac, vous avez très probablement l'implémentation FreeBSD de sed, auquel cas 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 d'exécuter un sed appel par fichier).

Dans l'implémentation FreeBSD de sed le -i L'indicateur a besoin d'un argument: l'extension d'un fichier de sauvegarde. Par exemple avec -i .bak la commande sauvegarderait file1.txt comme file1.txt.bak avant d'effectuer le remplacement dans le fichier d'origine. Utilisation d'un argument vide '' signifie de ne pas utiliser de fichier de sauvegarde, ce qui semble être ce que vous voulez.

La même chose dans l'implémentation GNU (ou NetBSD, OpenBSD, busybox) serait:

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

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

40
janos