Est-il possible d'utiliser gawkl' -i inplaceoption 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 stderrje 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 stdoutplace, ou un moyen plus propre d'imprimer ce bloc sur le flux alternatif?
greppeut ê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 gawkn'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 inplacefonctionne, sed -ile 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.