Substituindo string em todos os arquivos encontrados pelo grep. Não pode fazê-lo funcionar

4

Estou tentando fazer o que o título diz.

Então eu acho todos os arquivos necessários com o grep: grep --include=\*.{php,ini,conf,sh} -ril -P "'([\d\w\-\_\.]+)(@domain.com)'" '/var/www_data/somepath/'

Agora, presumo que seja o uso de sed ou perl para o processo de substituição, infelizmente não consigo descobrir como usar o regexp acima em nenhum deles. Eu vi desta forma e este mas como eu disse, não consegui fazer com que funcionasse com o meu padrão (e com isso quero dizer que obtenho o > na próxima linha depois de executar o comando. Assumo que seja problema com o regexp mostrado acima quando usado com sed ou perl), então qualquer conselho sobre esse assunto seria bom.

Além disso, não sei se é possível (não é realmente importante), mas gostaria de imprimir algumas strings para cada arquivo com a substituição ocorrida, por exemplo File fixed: /path/to/file/ (nomes de arquivos tirados da lista grep talvez? )

    
por Igor Yavych 06.09.2014 / 23:03

3 respostas

2

Normalmente, quando você recebe um > na próxima linha depois de bater, significa que uma de suas cotações ainda não está fechada. Eu não consegui encontrar esse erro no seu regex. Mas você não precisa cercar o caminho /var/www_data/somepath/ com aspas simples. Eu suponho que não há caracteres incomuns em somepath ?

De qualquer forma, testei sua regex com sed. \d\w parece com vim sintaxe para mim, é por isso que eu traduzi para ascii (que sempre funciona). Além disso, dentro de [] você não precisa escapar . :

sed -r "s/'([A-Za-z0-9_-.]+)(@domain.com)'/'adsf'/g" test.dat

De fato, você pode usar sed ou perl para sua tarefa. Você não precisa necessariamente de grep para gerar uma lista de arquivos, a menos que tenha GB de dados. Então, pré-ordenar pode resultar em um benefício de velocidade.

Para testar seu regex , você pode fazer o seguinte:

cd /var/www_data/somepath/
sed -r 's|pattern|replace-pattern|g' a_single_file.php

Quando estiver satisfeito com o resultado, basta adicionar o argumento -ibak ( --in-place=bak ) e executá-lo em todos os arquivos

find . -type f -name '*.php' -o -name '*.ini' -o name '*.conf' -o -name '*.sh' \
-exec sed -r -ibak 's|pattern|replace-pattern|g' '{}' \; 

Os arquivos originais estão sendo colocados em <orignalname.php>.bak .

Para responder sua última pergunta. Para este trabalho, grep é a ferramenta que você deseja, você pode executá-lo nos arquivos .bak gerados por sed acima:

grep --recursive --include='*.bak' -E --files-with-matches 'pattern' . > files_fixed.txt

ou simplesmente:

find . -type f -name '*.bak'
    
por 06.09.2014 / 23:15
2

Com o GNU sed você pode usar sed -i .

sed -i 'script' *.{php,ini,conf,sh}
    
por 06.09.2014 / 23:36
1

Maioria do Linux:

sed -i 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

No MacOS:

sed -i '' 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

O sed no MacOS está esperando um parâmetro de backup após -i, use uma string vazia se você não precisar de arquivos de backup. O "g" é para substituição global, caso contrário, é apenas o primeiro por linha.

    
por 07.09.2014 / 00:42