sed
Modification sur place
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