É possível usar gawk
a -i inplace
opção e também imprimir coisas stdout
?
Por exemplo, se eu quiser atualizar um arquivo e se houver alguma alteração, imprima o nome do arquivo e as linhas alteradas para que stderr
eu possa fazer algo como
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;}' {} +
mas existe uma maneira de usar stdout
ou uma maneira mais limpa de imprimir esse bloco no fluxo alternativo?
grep
pode ser. Meu primeiro instinto é evitar ter que "processar" o arquivo duas vezes, mas não ficaria surpreso se, de fato, fosse mais rápido. Ele só vai para mostrar por que eu posso confiar em meu intestino em tarefas de perfil
-print -exec gawk
não é mais executada) e 2) para na 1ª partida, a menos que a 1ª partida esteja no última linha, você ainda não está processando o arquivo inteiro duas vezes (é mais parecido com 1.X vezes). Além disso, se gawk -i inplace
obras como sed -i
ele vai editar o arquivo no local de qualquer maneira - timestamps de atualização ou seja, inode etc mesmo se não havia nada para editar ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
esse modo. Somente usará o awk para editar os arquivos que realmente contêm linhas que correspondem a esse padrão.