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;
Foi útil?

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

http://codesnippets.joyent.com/postss/show/2299

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top