Usando ED para manipular arquivos correspondidos por encontro
-
25-09-2019 - |
Pergunta
Seguindo o Recomendação do Bash-Hackers Wiki, Eu quero editar arquivos usando Ed.
Em particular, quero fazer o seguinte com Ed em vez de sed:
find . -type f -exec sed -i -e 's/a/b/g' {} \;
Vejo que Ed não opta como se o Sed's -e, até onde eu sei, os tipos e os redirecionamentos de IO são a única maneira de trabalhar com ele de forma não interativa.
Portanto, usar o ED de um script bash para fazer o mesmo que o comando sed acima seria:
ed file_name <<<$'g/a/s//b/g\nw'
Ou
echo $'g/a/s//b/g\nw' | ed file_name
Mas, até onde eu sei, é impossível envolver tubos ou redirecionamentos de IO no Find's -exec.
Eu sinto falta de alguma coisa? Ou é a única maneira de superar isso é usar loops?
for file in $(find . -type f -print); do ed $file <<<$'g/a/s//b/g\nw'; done;
Solução
find . -type f -exec bash -c 'ed -s "$2" <<< "$1"' _ $'g/a/s//b/g\nw' {} \;
E uma versão POSIX:
find . -type f -exec sh -c 'printf "%s\n" "g/a/s//b/g" w | ed -s "$1"' _ {} \;
O principal motivo para usar o ED sobre sed -i é que o ED edita arquivos enquanto sed -i substitui os arquivos, e isso é um problema se você tiver links que não deseja quebrar.
Outras dicas
Este snippet encontrado e ed apresenta um modo de teste (para que você possa verificar seu regex logo antes de uma operação acutal de substituição de massa):
Pesquise e substitua por Find & Ed
Coloque o comando ED com todos os redirecionamentos e "aqui documentos" em um script de shell e invocar isso do Find.
Mas eu tenho que perguntar: por que Ed? O que você acha que pode fazer com Ed que você não pode fazer com sed?