GNU awk
(communément trouvé sur les systèmes Linux), depuis la version 4.1.0, est capable d'inclure une " awk
bibliothèque source" avec -i
ou --include
sur la ligne de commande. L'une des bibliothèques sources distribuées avec GNU awk
est celle appelée inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Comme vous pouvez le voir, cela fait que la sortie du awk
code remplace le fichier d'entrée. La ligne disant there
n'est pas conservée car elle n'est pas sortie par le programme.
Avec un awk
script dans un fichier, vous l'utiliseriez comme
awk -i inplace -f script.awk datafile
Si la awk
variable INPLACE_SUFFIX
est définie sur une chaîne, la bibliothèque effectuera une sauvegarde du fichier d'origine avec cela comme suffixe de nom de fichier.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Si vous avez plusieurs fichiers d'entrée, chaque fichier doit être modifié individuellement sur place. Mais vous pouvez désactiver l'édition sur place pour un fichier (ou un ensemble de fichiers) en utilisant inplace=0
sur la ligne de commande avant ce fichier:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Dans la commande ci-dessus, file3
ne serait pas modifié sur place.
Pour une "édition sur place" plus portable d'un seul fichier, utilisez
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Cela copierait le fichier d'entrée dans un emplacement temporaire, puis appliquerait le awk
code sur le fichier temporaire lors de la redirection vers le nom de fichier d'origine.
Les opérations dans cet ordre (exécutées awk
sur le fichier temporaire et non sur le fichier d'origine) garantissent que les métadonnées du fichier (autorisations et propriété) du fichier d'origine ne sont pas modifiées.