[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Ajudinha com o sed usando $variaveis



2009/6/8 hamacker <sirhamacker@gmail.com>
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

Reply to: