Use sed para localizar e substituir uma string em vários arquivos [duplicados]

1
    

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" {} \;
    
por Bert 05.07.2017 / 19:26

3 respostas

2

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
    
por 05.07.2017 / 19:37
1

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.

    
por 05.07.2017 / 19:43
0

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
    
por 05.07.2017 / 19:28

Tags