J'aimerais éditer un fichier avec sed sous OS X. J'utilise la commande suivante:
sed 's/oldword/newword/' file.txt
La sortie est envoyée au terminal. fichier.txt n'est pas modifié. Les modifications sont enregistrées dans file2.txt avec cette commande:
sed 's/oldword/newword/' file1.txt > file2.txt
Cependant, je ne veux pas d'un autre fichier. Je veux juste éditer fichier1.txt. Comment puis-je faire ceci?
J'ai essayé le drapeau -i. Cela entraîne l'erreur suivante:
sed: 1: "file1.txt": invalid command code f
Vous pouvez utiliser le -i
drapeau correctement en lui fournissant un suffixe à ajouter au fichier sauvegardé. Prolonger votre exemple:
sed -i.bu 's/oldword/newword/' file1.txt
Vous donnera deux fichiers: un avec le nom file1.txt
qui contient la substitution, et une avec le nom file1.txt.bu
qui a le contenu original.
Légèrement dangereux
Si vous voulez écraser le fichier d'origine de manière destructive, utilisez quelque chose comme:
sed -i '' 's/oldword/newword/' file1.txt
^ note the space
En raison de la façon dont la ligne est analysée, un espace est requis entre le drapeau de l’option et son argument , car l’argument a une longueur égale à zéro.
À part peut-être jeter votre original, je ne suis pas au courant des autres dangers de tromper sed de cette façon. Il convient toutefois de noter que si cet appel de sed
fait partie d'un script, The Unix Way ™ (IMHO) consisterait à utiliser sed
de manière non destructive, vérifie qu'il est sorti proprement. , et ensuite seulement supprimez le fichier étranger.
J'ai un problème similaire avec MacOS
sed -i '' 's/oldword/newword/' file1.txt
ne fonctionne pas, mais
sed -i"any_symbol" 's/oldword/newword/' file1.txt
fonctionne bien.
Vous pouvez utiliser -i''
(--in-place
) Pour sed
comme déjà suggéré. Voir: L'argument in-place -i
, mais notez que l'option -i
Est une extension FreeBSD non standard et peut ne pas être disponible sur d'autres systèmes d'exploitation. Deuxièmement sed
est un [~ # ~] s [~ # ~] [~ # ~] ed [~ # ~] , ce n’est pas un éditeur de fichier .
Une autre méthode consiste à utiliser la substitution intégrée en mode Vim Ex, comme suit:
$ ex +%s/foo/bar/g -scwq file.txt
et pour plusieurs fichiers:
$ ex +'bufdo!%s/foo/bar/g' -scxa *.*
Pour éditer tous les fichiers de manière récursive, vous pouvez utiliser **/*.*
Si Shell le permet (activé par shopt -s globstar
).
Une autre solution consiste à utiliser gawk
et sa nouvelle extension "inplace" , par exemple:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
Vous pouvez utiliser:
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
Exemple:
sed -i -e 's/Hello/Bye/' file.txt
Cela fonctionne parfaitement dans Mac.
sed -i -- "s/https/http/g" file.txt
Cela crée des fichiers de sauvegarde. Par exemple. sed -i -e 's/hello/hello world/' testfile
_ crée pour moi un fichier de sauvegarde, testfile-e, dans le même répertoire.