Comment puis-je obtenir ma commande sed pour apporter des modifications permanentes à un fichier?

32

Est-ce possible? J'ai lu quelque part que la commande suivante le ferait:

sed -e [commande] [fichier]

mais il semblait faire la même chose que juste

sed [commande] [fichier]

(il n'a pas enregistré les modifications). Y at-il un moyen de faire cela en utilisant sed?

John
la source
2
Le -edrapeau représente l'expression. Vous voulez probablement le -idrapeau qui signifie in-placeet je vous recommande fortement d'utiliser sed -i.bak 's/../' filename
Valentin Bajrami

Réponses:

50

Je pense que vous recherchez -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Par exemple:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Si vous fournissez un suffixe, cela créera un fichier de sauvegarde:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

Le fichier d'entrée est modifié et une sauvegarde contenant les données du fichier d'origine est créée.

Notez également que ceci est pour GNU sed, il existe de légères différences de format entre les différentes sedimplémentations.

terdon
la source
4
Notez que la page de manuel est incorrecte. sedne fait pas de montage sur place. Il crée un nouveau fichier et écrase l'ancien, l'inode change.
Marco
2
@Marco C'est le moyen sûr de modifier un fichier sur place. «Éditer un fichier sur place» dans la documentation de sed signifie que le fichier d'origine (défini par son nom) est modifié et non que le fichier d'origine (défini par son inode) est modifié.
Gilles, arrête de faire le mal
2
@ Gilles Je suis tout à fait d'accord pour dire que c'est le moyen préféré pour éditer un fichier, mais je l'appellerais difficilement sur place . Mais cela se résume à la question de savoir comment un fichier est identifié, par inode ou par nom. Je dirais par inode, sinon des commandes similaires { rm file; cmd > file; } < fileconduiraient à la conclusion que cmd lit et écrit dans le même fichier, ce qui n’est pas le cas. Il s’agit de deux fichiers qui portent le même nom. Mais je ne veux pas commencer une discussion ici.
Marco
Sur macOS 10.14, je reçois sed: 1: "foo.txt": invalid command code flors de l'exécution sed -i 's/o/X/g' foo.txt. Cependant, fournir une extension, comme sed -i .bak 's/o/X/g' foo.txtfonctionne bien. Des idées comment le faire fonctionner sans créer de fichiers de sauvegarde?
Joshua Pinter
1
Ok, compris. Dans macOS, vous devez explicitement ajouter une chaîne vide pour l'option d'extension param:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter
2

Ces solutions fonctionnent pour HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2 perl -pi -e 's/Error/NO_Error/g' test1.sh

3 sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

utilisateur3114790
la source
Vous ne pouvez pas utiliser le tee-shirt askubuntu.com/a/752451
Steven Penny
1

-el'option est pour l'exécution de plusieurs sedcommandes

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

considérer file.txtcomme

linux os

alors O / P est

unix os

-i option enregistre les modifications en permanence ...

utilisateur195318
la source