Recherche…


Syntaxe

  • sed -I extension - FreeBSD sed (compteur de ligne continu)
  • sed -I [ extension ] - NetBSD et Illumos sed (compteur de ligne continu)
  • extension sed -i - FreeBSD sed
  • sed -i [ extension ] - NetBSD, OpenBSD, Illumos, BusyBox et GNU sed
  • sed --in-place [= extension ] - Illumos, BusyBox et GNU sed

Paramètres

Paramètre Détails
extension Enregistrez un fichier de sauvegarde avec l'extension spécifiée ou aucun fichier de sauvegarde lorsque l' extension est une chaîne de longueur nulle.

Remarques

La modification sur place est une extension courante mais non standard présente dans la majorité des systèmes récents.

A partir d'un manuel BSD sed

(une section comme celle-ci apparaît dans tous les manuels BSD sed actuels et ceux de leurs dérivés)

Il est déconseillé de donner une extension de longueur nulle lors de la modification de fichiers en place, car cela risque d’être corrompu ou de contenir un contenu partiel dans des situations où l’espace disque est épuisé, etc.

N'oubliez pas le puissant ed

Il y a certainement une utilisation pour sed et pour les fonctionnalités d'édition sur place de sed , mais lorsque la norme UNIX est étendue, nous devrions toujours nous demander pourquoi l'ancienne norme UNIX n'incluait pas cette fonctionnalité. Bien qu'UNIX ne soit pas parfait, l'orthogonalité et la complétude des outils ont été développées pour être assez proches de la perfection, du moins aux fins visibles vers 1970: l' édition de texte et l'édition automatique du texte étaient visibles à cette époque.

En fait, l'idée de sed n'est pas d'éditer un fichier en place, mais d'éditer un flux . C'est pourquoi le nom sed est une forme abrégée d' éditeur de flux . Supprimez le s , et vous obtenez l'outil qui a été conçu pour l'édition de fichiers : ed :

printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file

ou cat file_edit_commands | ed file .

Remplacement des chaînes dans un fichier sur place

sed -i s/"what to replace"/"with what to replace"/g $file

Nous utilisons -i pour sélectionner l'édition sur place du $file file. Dans certains systèmes, il est nécessaire d'ajouter un suffixe après l' -i qui sera utilisée pour créer une sauvegarde du fichier d'origine. Vous pouvez ajouter une chaîne vide comme -i '' pour omettre la création de la sauvegarde. Regardez Remarques dans cette rubrique à propos de l'option -i .

Le g terminateur signifie faire une recherche / remplacement globale dans chaque ligne.

$ cat example 
one
two
three
total
$ sed -i s/"t"/"g"/g example 
$ cat example 
one
gwo
ghree
gogal

Utilisation portable

La modification sur place, bien que commune, est une fonctionnalité non standard. Une alternative viable serait d'utiliser un fichier intermédiaire pour stocker l'original ou la sortie.

sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file

Pour utiliser l'option -i avec la syntaxe GNU et FreeBSD, une extension doit être spécifiée et ajoutée à l'option -i . Les éléments suivants seront acceptés par les deux et produiront deux fichiers, la version originale à file.orig et la version modifiée au file :

sed -i.orig 'sed commands' file

Voir un exemple basique donné un fichier file :

$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file                       # the original file has changed its content
XX
two
three
$ cat file.orig                  # the original content is now in file.orig
one
two
three

Un exemple plus complexe, remplaçant chaque ligne par un numéro de ligne:

$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2

Pourquoi un fichier de sauvegarde est requis

Pour utiliser sans fichier de sauvegarde que l' édition en place, -i doit être donné un argument de longueur nulle et FreeBSD sed nécessite un argument -i , soit en annexe ou séparément, tandis que l'extension argument optionnel GNU requiert l'argument soit ajouté à -i . Les deux prennent en charge l’ajout de l’argument à -i , mais sans qu’il soit nécessaire -i'' command est indiscernable de l’ -i extension , donc un argument de longueur nulle ne peut pas être ajouté à -i .

La modification sur place sans spécifier de fichier de sauvegarde remplace les autorisations en lecture seule

sed -i -e cmd file modifie le file même si ses autorisations sont définies en lecture seule.

Cette commande se comporte de la même manière que

sed -e cmd file > tmp; mv -f tmp file

plutôt que

sed -e cmd file > tmp; cat tmp > file; rm tmp

L'exemple suivant utilise gnu sed :

$ echo 'Extremely important data' > input
$ chmod 400 input  # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input  
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)

Cela peut être atténué en créant une sauvegarde en spécifiant un SUFFIX avec l'option i :

$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow