Substitua a string como $ test

0

Estou tendo muitos arquivos de texto com diretórios diferentes. Eu preciso pesquisar uma string específica e preciso substituir a string pelo valor específico como $test . Eu preciso pesquisar todos os arquivos em todos os diretórios, para isso.

Exemplo: Em um arquivo há uma string como abcd , eu preciso substituir a string abcd as $test . Eu tenho um script que está pesquisando a seqüência de caracteres em todos os arquivos e substituindo a seqüência de caracteres. Mas não consigo substituir a string com o símbolo $ . O script abaixo está funcionando sem $ .

command="find \'pwd\' -name \"*\" -type f -exec grep -l \"abcd\" {} \; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/test/g;'"

Abaixo, o script não está funcionando com o símbolo $ .

command="find \'pwd\' -name \"*\" -type f -exec grep -l \"abcd\" {} \; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/\$test/g;'"

Como substituir a string abcd por $test .

    
por palani 14.05.2018 / 21:15

1 resposta

2

Não tente colocar comandos em variáveis (por exemplo, " Como podemos executar um comando armazenado em uma variável? ").

Seu comando está tendo problemas com o $ porque o Perl o usa em suas variáveis escalares. Você teria que escapar não apenas do shell, mas também do Perl ( \\$ ).

Para substituir abcd por $test em todos os arquivos dentro ou abaixo do diretório atual usando find e GNU ou BSD sed , use

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec sed -i.bak 's/abcd/$test/g' {} ';'

Isso localizará todos os arquivos regulares, testará se a string existe no arquivo e, se houver, substituirá-a pela string $test (criando um backup do arquivo original com o sufixo .bak ).

A mesma coisa, mas usando Perl:

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec perl -pi.bak -e 's/abcd/$test/g' {} ';'

Se você remover a parte -exec grep , obterá arquivos de backup para todos os arquivos, mesmo que eles não tenham contido a string abcd .

    
por 14.05.2018 / 21:33