Você está misturando classes de personagens (uma lista de caracteres dentro de colchetes) com os nomes de compartilhamento smb.conf que estão rodeados por literais colchete. Além disso, o comando echo
não é bem formado:., No caso onde sed
saídas com um status diferente de zero, o shell tentará chamar o comando Failed
Algumas sugestões:
- Remover a classe de caracteres (colchetes externos)
- Remova o
.*
inicial que removerá os comentários principais, etc. - Executar um único comando
sed
com várias instruções - Corrigir a mensagem do caso de erro
sed -i 's/\[CMI\]/\[CMI\$\]/;
s/\[LOCAL\]/\[LOCAL\$\]/;
s/\[NATIONAL\]/\[NATIONAL\$\]/' $smbconffile && echo "Success" || echo "Failed"'
Você pode usar referências anteriores para evitar redigitação o prefixo original na expressão de substituição (por exemplo, '[CMI'), mas que pode tornar as expressões ainda mais difícil de ler.
Outra sugestão é usar Perl que tenha agrupamento legível e backreferences IMO:
perl -pi -e 's/(\[(?:CMI|LOCAL|NATIONAL))\]/$1\$]/g' $smbconffile \
&& echo "Success" || echo "Failed"
Editar: Para esclarecer, o problema com a expressão original com os suportes exteriores é que você está criando uma classe de caracteres que corresponde a qualquer cadeia que contenha (no primeiro caso) [
, C
, M
, I
, ]
em qualquer ordem seguido por ]
. Por exemplo:
$ echo '[IMC]' | sed 's/[\[CMI\]]/[something_else]/'
[IM[something_else]
$ echo '[FOOM]' | sed 's/[\[CMI\]]/[something_else]/'
[FOO[something_else]
A remoção dos colchetes externos remove a classe de caractere para que a expressão corresponda à substring exata fornecida.