J'ai utilisé avec succès la sed
commande suivante pour rechercher / remplacer du texte sous Linux:
sed -i 's/old_link/new_link/g' *
Cependant, lorsque je l'essaye sur mon Mac OS X, j'obtiens:
"la commande c attend \ suivie du texte"
Je pensais que mon Mac exécute un shell BASH normal. Quoi de neuf?
ÉDITER:
Selon @High Performance, cela est dû au fait que Mac sed
est d'une saveur différente (BSD), donc ma question serait donc de savoir comment répliquer cette commande dans BSD sed
?
ÉDITER:
Voici un exemple réel qui provoque cela:
sed -i 's/hello/gbye/g' *
sed
voit un "c" dans vos données comme une commande. Utilisez-vous une variable? Veuillez publier quelque chose qui représente de plus près la commande réelle et certaines données que vous traitez. Vous pouvez obtenir une démonstration simple de cette erreur en faisantecho x | sed c
.Réponses:
Si vous utilisez l'
-i
option, vous devez fournir une extension pour vos sauvegardes.Si tu as:
La commande (notez le manque d'espace entre
-i
et''
et-e
pour le faire fonctionner sur les nouvelles versions de Mac et sur GNU):Créez 2 fichiers de sauvegarde comme:
Il n'y a aucun moyen portable d'éviter de créer des fichiers de sauvegarde car il est impossible de trouver un mélange de commandes sed qui fonctionne dans tous les cas:
sed -i -e ...
- ne fonctionne pas sur OS X car il crée des-e
sauvegardessed -i'' -e ...
- ne fonctionne pas sur OS X 10.6 mais fonctionne sur 10.9+sed -i '' -e ...
- ne fonctionne pas sur GNURemarque Étant donné qu'aucune commande sed ne fonctionne sur toutes les plates-formes, vous pouvez essayer d'utiliser une autre commande pour obtenir le même résultat.
Par exemple,
perl -i -pe's/old_link/new_link/g' *
la source
sed
, vous avez fourni un suffixe de sauvegarde. Le suffixe de sauvegarde ests/old_link/new_link/g
. L'argument suivant est censé être les commandes d'édition. Parce qu'il a interprété les commandes comme le nom de sauvegarde, il a ensuite pris le premier nom de fichier comme commandes d'édition, mais elles n'étaient pas valides.sed -i '' -e ...
?sed -i'' -e
semble ne pas fonctionner comme prévu sur mac 10.14Je crois que sur OS X lorsque vous utilisez -i, une extension pour les fichiers de sauvegarde est requise . Essayer:
En utilisant GNU,
sed
l'extension est facultative .la source
Cela fonctionne avec les versions GNU et BSD de sed:
ou avec sauvegarde:
Notez l'espace manquant après l'
-i
option! (Nécessaire pour GNU sed)la source
rm
commande juste après pour le supprimer.sed -i'' ...
=>sed -i '' ...
A eu le même problème sous Mac et l'a résolu avec
brew
:et utiliser comme
vous pouvez définir aussi bien
sed
que l'aliasgsed
(si vous le souhaitez):la source
Ou, vous pouvez installer la version GNU de sed dans votre Mac, appelée gsed, et l'utiliser en utilisant la syntaxe Linux standard.
Pour cela, installez en
gsed
utilisant les ports (si vous ne l'avez pas, obtenez-le sur http://www.macports.org/ ) en exécutantsudo port install gsed
. Ensuite, vous pouvez exécutersed -i 's/old_link/new_link/g' *
la source
gnu-sed
Votre Mac exécute en effet un shell BASH, mais c'est plutôt une question d'implémentation de sed avec laquelle vous avez affaire. Sur un Mac sed vient de BSD et est subtilement différent de sed que vous pourriez trouver sur une boîte Linux typique. Je vous propose
man sed
.la source
La réponse de Sinetris est juste, mais je l'utilise avec la
find
commande pour être plus précis sur les fichiers que je souhaite modifier. En général, cela devrait fonctionner (testé sur osx/bin/bash
):En général, l'utilisation de
sed
sansfind
dans des projets complexes est moins efficace.la source
-exec
est très beau! Je me demande simplement si la barre oblique à la fin est réellement nécessaire\
, le;
obtenu interprété par le shell lorsque j'ai essayé un telJ'ai créé une fonction pour gérer la
sed
différence entre MacOS (testé sur MacOS 10.12) et d'autres OS:Usage:
Où:
,
est un délimiteur's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
est un modèle"./mysql/.env"
est le chemin vers le fichierla source
Voici comment appliquer des variables d'environnement au fichier modèle (pas besoin de sauvegarde).
1. Créez un modèle avec {{FOO}} pour un remplacement ultérieur.
2. Remplacez {{FOO}} par la variable FOO et exportez vers le nouveau fichier foo.conf
Fonctionnant à la fois sur macOS 10.12.4 et Ubuntu 14.04.5
la source
Comme les autres réponses l'indiquent, il n'y a aucun moyen d'utiliser sed de manière portative sur OS X et Linux sans créer de fichiers de sauvegarde. J'ai donc plutôt utilisé ce Ruby one-liner pour le faire:
Dans mon cas, je devais l'appeler à partir d'une
rake
tâche (c'est-à-dire à l'intérieur d'un script Ruby), j'ai donc utilisé ce niveau supplémentaire de citation:la source
Fonctionne à la fois sur BSD et Linux
la source
e
annexe