2009/6/8 hamacker <[email protected]>

> Olá pessoal, isso aqui não funciona :
> $search_for="# deb http://archive.canonical.com/ubuntu jaunty partner"
> $replace_to="deb http://archive.canonical.com/ubuntu jaunty partner"
> sed -i  's/"$search_for"/"$replace_to"/g'   /etc/apt/sources.list
>
> Se eu trocar as variaveis por frases literais, aí funciona :
> sed -i 's/# deb http:\/\/archive.canonical.com\/ubuntu jaunty
> partner/deb http:\/\/archive.canonical.com\/ubuntu jaunty partner/g'
> /etc/apt/sources.list
>
> O exemplo acima é apenas um demonstrativo, mas o objetivo é tirar
> remarks de linhas especificas de arquivos textos usando o sed.
> Onde tá a zica ? porque não consigo embutir variaveis na instrução do sed ?


Hamacker, alguns comentarios:
1) Vc está cercando o comando sed com aspas simples. Dessa maneira, o bash
não enxergará as variáveis que estão lá dentro. Eh o mesmo caso de vc fazer:
echo 'Eu tenho $qtd anos'. A variavel $qtd não será identificada e não será
substituida por seu valor. Portanto, vc deverá usar aspas duplas
2) Como ao redor já vai estar aspas duplas (vide 1), não da para utilizar
aspas duplas ao redor das variaveis tb -- mt menos aspas simples. Eu entendo
que vc usou por causa dos espaços nas strings, mas nesse caso não tem
problema, pode deixar de usá-las que vai funcionar.
3) No meio das strings search_for e replace_for tem o caracter "/". Isso tb
irá atrapalhar, pois eh o mesmo caracter que separa os campos do comando
sed. É só vc trocar os "/" que estão no sed por um outro caracter que não
esteja em nenhuma das strings. Por exemplo, o pipe "|".

Ficaria assim então:

sed "s|$search_for|$replace_to|g" /etc/apt/sources.list

Testei aqui e deu certo:

*[~]: search_for="# deb http://archive.canonical.com/ubuntu jaunty partner"
[~]: replace_to="deb http://archive.canonical.com/ubuntu jaunty partner"
[~]: sed "s|$search_for|$replace_to|g" /etc/apt/sources.list | grep partner*
## 'partner' repository.
deb http://archive.canonical.com/ubuntu jaunty partner
# deb-src http://archive.canonical.com/ubuntu jaunty partner
*[~]: grep partner /etc/apt/sources.list*
## 'partner' repository.
# deb http://archive.canonical.com/ubuntu jaunty partner
# deb-src http://archive.canonical.com/ubuntu jaunty partner

Só tirei o -i para não substitui no meu arquivo (nem tava como root, então
ia dar permissão negada).
E só pra lembrar que, nesse caso, o -g não é necessário.

Retorne pra ver se era isso mesmo.

Falous!!
-- 
João Olavo Baião de Vasconcelos
Bacharel em Ciência da Computação
Analista de Sistemas - Infraestrutura
joaoolavo.wordpress.com

Responder a