web-dev-qa-db-fra.com

Éditions en place avec sed sur OS X

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
125
SundayMonday

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.

243
whittle

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.

17
ksnt

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
4
kenorb

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.

4
Vincent Lal
sed -i -- "s/https/http/g" file.txt
3
jazzed

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.

1
JustADude