Dans le shell Linux, la commande suivante recherchera et remplacera récursivement toutes les instances de «this» par «that» (je n'ai pas de shell Linux devant moi, mais cela devrait le faire).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
À quoi ressemblera une commande similaire sur OSX?
apple.stackexchange.com
car ce n'est pas assez générique pour Linux ni pour tous les développeurs.Réponses:
OS X utilise un mélange d'outils BSD et GNU, il est donc préférable de toujours vérifier la documentation (même si je l'avais qui
less
n'était même pas conforme à la page de manuel OS X):https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed prend l'argument après
-i
comme extension pour les sauvegardes. Fournissez une chaîne vide (-i ''
) pour aucune sauvegarde.Ce qui suit devrait faire:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
C'est
-type f
juste une bonne pratique; sed se plaindra si vous lui donnez un répertoire ou plus.-exec
est préféré àxargs
; vous n'avez pas besoin de vous soucier de-print0
quoi que ce soit. Le{} +
à la fin signifie qu'ilfind
ajoutera tous les résultats en tant qu'arguments à une instance de la commande appelée, au lieu de la réexécuter pour chaque résultat. (Une exception est lorsque le nombre maximal d'arguments de ligne de commande autorisés par le système d'exploitation est violé; dans ce cas,find
il exécutera plus d'une instance.)la source
%
caractère:sed "s%localhost/site%blah/blah%"
. Une autre alternative consiste à échapper au backslasher-séparateur:sed "s/localhost\/site/blah\/blah/"
.illegal byte sequence
erreur? si oui, essayez:,LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
cela a fonctionné pour moi./g
pour plusieurs devises commeLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Pour le mac, une approche plus similaire serait la suivante:
la source
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Comme solution alternative, j'utilise celle-ci sur Mac OSX 10.7.5
Le mérite revient à: la réponse de Todd Cesere
la source
Sur Mac OSX 10.11.5, cela fonctionne bien:
la source
Aucun des éléments ci-dessus ne fonctionne sous OSX.
Procédez comme suit:
la source
Une version qui fonctionne à la fois sur Linux et Mac OS X (en ajoutant le
-e
commutateur àsed
):la source
export LC_CTYPE=C && export LANG=C
Chaque fois que je tape cette commande, j'ai toujours l'impression de l'arroser ou d'oublier un drapeau. J'ai créé un Gist sur github basé sur la réponse de TaylanUB qui effectue un remplacement de recherche globale à partir du répertoire actuel. Ceci est spécifique à Mac OSX.
https://gist.github.com/nateflink/9056302
C'est bien parce que maintenant je viens d'ouvrir un terminal puis de copier:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
Vous pouvez obtenir des erreurs de séquence d'octets étranges, voici donc le code complet:
la source
C'est ma solution réalisable. sur mac OS X 10.10.4
Ceux ci-dessus utilisent find modifiera les fichiers qui ne contiennent pas le texte de recherche (ajoutez une nouvelle ligne à la fin du fichier), ce qui est détaillé.
la source
Si vous utilisez un terminal zsh, vous pouvez utiliser la magie des caractères génériques:
sed -i "" "s/search/high-replace/g" *.txt
la source
J'ai utilisé ce format - mais ... j'ai trouvé que je devais l'exécuter trois fois ou plus pour qu'il change réellement chaque instance que je trouvais extrêmement étrange. L'exécuter une fois en changerait certains dans chaque fichier mais pas tous. Exécuter exactement la même chaîne deux à quatre fois attraperait toutes les instances.
la source
g
à la fin, sinon elle ne remplace que la première occurrence dethistext
dans une ligne. Donc votre regex devrait êtres/thistext/newtext/g
https://bitbucket.org/masonicboom/serp est un utilitaire go (c'est-à-dire multiplateforme), testé sur OSX, qui effectue une recherche récursive et remplace du texte dans des fichiers dans un répertoire donné, et confirme chaque remplacement. C'est nouveau, donc peut-être buggy.
L'utilisation ressemble à:
la source
Reportez-vous ici pour plus d'informations.
la source
La commande sur OSX devrait être exactement la même que sur Unix sous la jolie interface utilisateur.
la source
-print0
ajouter auxfind
drapeaux et-0
auxxargs
drapeaux.-exec sed -i s/this/that/g {} \+
place de-print
et xargsxargs
pourrait voir le "./jacobus" délimité par des espaces comme un fichier à passersed
, puis avec "R.txt" , dont aucun n’existe.pourrait simplement dire $ PWD au lieu de "."
la source