GNU awk(communément trouvé sur les systèmes Linux), depuis la version 4.1.0, est capable d'inclure une " awkbibliothèque source" avec -iou --includesur la ligne de commande. L'une des bibliothèques sources distribuées avec GNU awkest 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 awkcode remplace le fichier d'entrée. La ligne disant theren'est pas conservée car elle n'est pas sortie par le programme.
Avec un awkscript dans un fichier, vous l'utiliseriez comme
awk -i inplace -f script.awk datafile
Si la awkvariable INPLACE_SUFFIXest 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=0sur 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, file3ne 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 awkcode sur le fichier temporaire lors de la redirection vers le nom de fichier d'origine.
Les opérations dans cet ordre (exécutées awksur 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.