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