Você tem uma falha no seu loop for
. Remova o comando ls
e adicione a variável $f
como o argumento para sed -i
, que editará cada filename.xml
no lugar:
for f in *.xml; do sed -i "s|foo|bar|g" "$f"; done
Esta pergunta já tem uma resposta aqui:
Estou tentando passar uma lista de arquivos com um conjunto conhecido de caracteres para sed para encontrar e substituir.
Para um diretório contendo vários arquivos .xml:
ls -la
file1.xml
file2.xml
file3.xml
Cada um contendo uma string correspondente:
grep -i foo *
file1.xml <foo/>
file2.xml <foo/>
file3.xml <foo/>
Substitua foo por barra usando um loop for:
for f in *.xml; do ls | sed -i "s|foo|bar|g" ; done
Retorna:
sed: no input files
sed: no input files
sed: no input files
Eu já descobri uma alternativa que funciona, então isso é principalmente para a minha própria edificação neste momento.
find /dir/ -name '*.xml' -exec sed -i "s|foo|bar|g" {} \;
Note que no GNU sed você pode editar vários arquivos e também no local. Então sua tarefa reduz para:
sed -i -se 's|foo|bar|g' *.xml
-s for --separate
é a opção sed
que faz isso.
sed está esperando o caminho de entrada como um parâmetro. Portanto, tente uma construção como a seguinte:
… | sed -i "…" /dev/stdin
Seria ainda mais fácil usar os arquivos como parâmetro, como este (não testado):
sed -i "..." *.xml