Можно ли использовать gawk
«s -i inplace
варианта , а также печатать вещи stdout
?
Например, если я хочу обновить файл, и если есть какие-либо изменения, напечатайте имя файла и измененные строки, чтобы stderr
я мог сделать что-то вроде
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;}' {} +
но есть ли способ использовать stdout
вместо этого или более чистый способ печати этого блока в альтернативный поток?
grep
может быть. Мой первый инстинкт - не обрабатывать файл дважды, но я не удивлюсь, если он действительно быстрее. Это просто показывает, почему я могу доверять своей интуиции в задачах профилирования
-print -exec gawk
больше не выполняется) и 2) он остановится на первом совпадении, поэтому, если первое совпадение не будет В последней строке вы все еще не обрабатываете весь файл дважды (это больше похоже на 1X раз). Кроме того, если он gawk -i inplace
работает как-то, sed -i
он все равно будет редактировать файл на месте - т.е. обновлять метки времени, inode и т. Д., Даже если редактировать было нечего ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
, вы будете использовать awk только для редактирования файлов, которые на самом деле содержат строки, соответствующие этому шаблону.