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. file.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 file1.txt . Comment puis-je faire ceci?
J'ai essayé l'indicateur -i. Cela entraîne l'erreur suivante:
sed: 1: "file1.txt": invalid command code f
-i
drapeau?Réponses:
Vous pouvez utiliser
-i
correctement l' indicateur en lui fournissant un suffixe à ajouter au fichier sauvegardé. Prolonger votre exemple:Vous donnera deux fichiers: un avec le nom
file1.txt
qui contient la substitution et un avec le nomfile1.txt.bu
qui a le contenu original.Légèrement dangereux
Si vous souhaitez écraser de manière destructive le fichier d'origine, utilisez quelque chose comme:
En raison de la façon dont la ligne est analysée, un espace est requis entre l'indicateur d'option et son argument car l'argument est de longueur nulle.
Hormis le fait de détruire votre original, je ne suis pas au courant des autres dangers de tromper sed de cette façon. Il convient de noter, cependant, que si cet appel de
sed
fait partie d'un script, The Unix Way ™ serait (à mon humble avis) d'utiliser de manièresed
non destructive, de tester qu'il est sorti proprement et de supprimer ensuite le fichier superflu.la source
-i''
dangereux pour une raison autre que de potentiellement gâcher le fichier d'origine (et ne pas avoir de sauvegarde)?sed
page de manuel, si vous manquez d'espace disque sur le périphérique, vous pouvez corrompre un fichier à mi-chemin et obtenir un résultat de sortie incorrect. Si vous travaillez sous contrôle de source localsed -i ""
sans sauvegardes, cela devrait aller la plupart du temps (ou justegit init && git add -A . && git commit -m 'backup'
avant d'exécuter sed en-i
mode).-i''
est valide, mais-i ''
ne l'est pas.J'ai un problème similaire avec MacOS
ne fonctionne pas, mais
fonctionne bien.
la source
sed -i '' <file>
fonctionne maissed -i'' <file>
ne fonctionne plusla source
Vous pouvez utiliser
-i''
(--in-place
) poursed
comme déjà suggéré. Voir: L'-i
argument sur place , cependant, notez que l'-i
option est des extensions FreeBSD non standard et peut ne pas être disponible sur d'autres systèmes d'exploitation. En second lieused
est un S tream ED Itor, pas un éditeur de fichiers .Une autre méthode consiste à utiliser la substitution intégrée en mode Vim Ex, comme:
et pour plusieurs fichiers:
Pour éditer tous les fichiers de manière récursive, vous pouvez utiliser
**/*.*
si le shell le prend en charge (activer parshopt -s globstar
).Une autre façon est d'utiliser
gawk
et sa nouvelle extension "inplace" telle que:la source
Cela crée des fichiers de sauvegarde. Par exemple,
sed -i -e 's/hello/hello world/' testfile
pour moi, crée un fichier de sauvegarde, testfile-e, dans le même répertoire.la source
Vous pouvez utiliser:
Exemple:
Cela fonctionne parfaitement sous Mac .
la source
-i
nécessite un argument pour macOS. Comme vous n'en spécifiez pas, il l'utilise-e
, ce qui entraîne un deuxième fichier avec-e
.-e
n'existe pas dans macOS, c'est le cas-E
. La commande correcte pour macOS estsed -i '' -E 's/Hello/Bye/' file.txt