Re: Ajudinha com o sed usando $variaveis
hamacker escreveu: 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 ? []'s Olá, Você vai precisar de uma função auxiliar para fazer isso ou digitar antes de cada barra normal uma invertida. Segue duas idéias: function sed_ready { echo "$1" | sed 's/\//\\\//g'; } $search_for="`sed_ready "# deb http://archive.canonical.com/ubuntu jaunty partner"`" $replace_to="`sed_ready "deb http://archive.canonical.com/ubuntu jaunty partner"`" sed -i "s/$search_for/$replace_to/" /etc/apt/sources.list Ou ainda: function sed_ready { echo "$1" | sed 's/\//\\\//g'; } $repository="`sed_ready "http://archive.canonical.com/ubuntu jaunty partner"`" sed -i "s/# deb $repository/deb $repository/" /etc/apt/sources.list []'s Junior Polegato -- To UNSUBSCRIBE, email to debian-user-portuguese-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
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 : > 2009/6/8 hamacker >> >> 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 > -- To UNSUBSCRIBE, email to debian-user-portuguese-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Re: Ajudinha com o sed usando $variaveis
2009/6/8 hamacker > 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
Re: Ajudinha com o sed usando $variaveis
On Monday 08 June 2009 19:13:47 Ataliba Neto wrote: > Pelo que entendi, ele não funciona pq não possui as \ > E quando se recebe uma variável que possui / o sed não funfa. > > Então tem que dá um jeito de trocar as / por \/ antes de executar o sed. > > Sempre ás Ordens, Outra coisa. AFAICS, as variáveis não estão funcionando porque estão dentro de aspas simples ( sed -i ' "$bla" "$bla" ...' ) ;) [ ]'s -- To UNSUBSCRIBE, email to debian-user-portuguese-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Re: Ajudinha com o sed usando $variaveis
Pelo que entendi, ele não funciona pq não possui as \ E quando se recebe uma variável que possui / o sed não funfa. Então tem que dá um jeito de trocar as / por \/ antes de executar o sed. Sempre ás Ordens, -- Ataliba Neto. "O que Deus faz nenhum software é capaz." http://www.atalibaneto.com.br
Ajudinha com o sed usando $variaveis
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 ? []'s -- To UNSUBSCRIBE, email to debian-user-portuguese-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org