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

Re: Ajudinha com o sed usando $variaveis



Olá, a todos,

As aspas eram duplas e não funcionaram, daí foi trocado por simples.
Agora com a sua explicação fiquei sabendo do uso da /, e provavelmente
foi isso que deu errado, pois minha variavel tambem possuía /.
Com a sua ajuda e a possibilidade de trocar o delimitador / por |
(pipe) acho que não terei mais problemas. Se ainda tiver problemas,
volto o contato.

Obrigado a todos.

2009/6/8 João Olavo Baião de Vasconcelos <joaoolavo@gmail.com>:
> 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: