Modifications sur place avec sed sur OS X

Je voudrais éditer un fichier avec sed sur 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’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 drapeau -i correctement en lui fournissant un suffixe à append au fichier sauvegardé. Étendre 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 un avec le nom file1.txt.bu qui a le contenu d’origine.

Légèrement dangereux

Si vous souhaitez écraser de manière destructive le fichier d’origine, 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 requirejs entre l’option flag et son argument car l’argument est de longueur zéro.

À part peut-être la destruction de votre original, je ne suis pas au courant d’autres dangers de tromper Sed de cette façon. Il convient de noter, cependant, que si cette invocation de sed fait partie d’un script, The Unix Way ™ (IMHO) devrait utiliser sed non destructive, tester qu’il est sorti proprement, et seulement ensuite supprimer 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 -i in-place , toutefois, notez que l’option -i est une extension FreeBSD non standard et peut ne pas être disponible sur d’autres systèmes d’exploitation. En second lieu, sed est un éditeur de stream, pas un éditeur de fichiers .


Un autre moyen consiste à utiliser la substitution intégrée en mode Vim Ex, comme:

 $ ex +%s/foo/bar/g -scwq file.txt 

et pour plusieurs fichiers:

 $ ex +'bufdo!%s/foo/bar/g' -scxa *.* 

Pour éditer tous les fichiers récursivement, vous pouvez utiliser **/*.* Si le shell le supporte (activer par shopt -s globstar ).


Une autre méthode consiste à utiliser gawk et sa nouvelle extension “inplace” telle que:

 $ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 
 sed -i -- "s/https/http/g" file.txt 

vous pouvez utiliser,

sed -i -e ‘s ///’

exemple, sed -i -e ‘s / Hello / Bye /’ file.txt

cela fonctionne impeccable dans mac

Cela crée des fichiers de sauvegarde. Par exemple sed -i -e 's/hello/hello world/' testfile de sed -i -e 's/hello/hello world/' testfile pour moi, crée un fichier de sauvegarde, testfile-e, dans le même répertoire.