Чи можна використовувати 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) він зупиняється на 1-му поєдинку, тому, якщо 1-й збіг не буде останній рядок, ви все ще не обробляєте весь файл двічі (це більше як 1.X разів). Крім того, якщо 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 для редагування файлів, які насправді містять рядки, що відповідають цьому шаблону.