br comando no console funciona; mas no shell script lança erro

1

Eu estou tentando escrever um script de shell para substituir a string SEARCH pela string REPLACE em todos os arquivos do diretório atual (diretório onde meu script permanece).

A condição que tenho é: o script deve substituir a 'string de pesquisa' por 'replace string' em todos os arquivos, exceto o shell script.

Eu tentei o comando sed no console. Funcionou como eu esperava. Mas quando adicionei este comando sed ao meu script, ele gera um erro.

O comando no meu script (replace.sh) é:

search_str=is;
replace_str=IS;
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)

O erro que recebo é:

./replace.sh: line 11: syntax error near unexpected token '('
./replace.sh: line 11: 'sed -i.bak s/$search_str/$replace_str/g !(replace.sh)'

Espero que você possa me ajudar .. Obrigado antecipadamente ..

    
por SILVIYA 14.01.2016 / 07:54

3 respostas

0

Você precisa ativar extglob no script, pelo menos nesse ponto.

#!/bin/bash
search_str=is                  # Variable Initialization 
replace_str=IS
                               # Other stuffs other 7 lines in your script
Old_State=$(shopt -p extglob)  # Here you save the value of shopt extglob

shopt -s extglob               # Here you change (if needed) that value
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)

$Old_State                     # Here you restore the previous value of extglob
                               # Other code ...    

Eu proponho que você salve e restaure o status do extglob caso o script seja longo e tenha algum outro comando que precise do status da opção ... Claro que se você está escrevendo seu próprio script, você pode decidir para escrevê-lo com o extglob ativado e para ser consistente com ele: então você só precisa adicionar shopt -s extglob no script antes dessa linha (# 11).

Mais informações com help shopt do shell.

    
por 14.01.2016 / 13:46
1

Isso ocorre porque os padrões estendidos , como !(replace.sh) , não estão ativados. Adicione shopt -s extglob ao seu script.

    
por 14.01.2016 / 12:25
0

depois de trabalhar um pouco no seu problema, acho que posso ter a solução

#!/bin/bash

search_str=is;
replace_str=IS;
find .  -maxdepth 1 -type f ! -wholename $0 -exec sed -i s@$search_str@$replace_str@g {} \;

Eu usei find com -maxdepth 1 top para aplicar a alteração sed a todos os arquivos na pasta em que o script está. ! -wholename $ 0 faz com que o script evite ser usado em si mesmo

Atenciosamente

    
por 14.01.2016 / 09:31