Est-il possible d'utiliser gawk
l' -i inplace
option de et d'imprimer également des choses sur stdout
?
Par exemple, si je voulais mettre à jour un fichier et s'il y a des changements, imprimez le nom du fichier et les lignes modifiées pour que stderr
je puisse faire quelque chose comme
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
mais existe-t-il un moyen d'utiliser à la stdout
place, ou un moyen plus propre d'imprimer ce bloc sur le flux alternatif?
grep
peut être. Mon premier réflexe est d'éviter de devoir "traiter" deux fois le fichier, mais je ne serais pas du tout surpris s'il est en effet plus rapide néanmoins. Cela montre simplement pourquoi je peux faire confiance à mon instinct pour les tâches de profilage
-print -exec gawk
n'est plus exécutée) et 2) il s'arrêtera au 1er match, donc à moins que le 1er match ne soit sur le dernière ligne, vous ne traitez toujours pas le fichier entier deux fois (c'est plus comme 1.X fois). De plus, si cela gawk -i inplace
fonctionne, sed -i
le fichier sera modifié sur place de toute façon - c'est-à-dire la mise à jour des horodatages, de l'inode, etc. même s'il n'y avait rien à modifier ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
ça, vous n'utiliserez awk que pour modifier les fichiers qui contiennent réellement des lignes correspondant à ce modèle.