[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RES: RES: [shell-script] Variaveis no sed
From: |
Julio Cezar Neves - DATAPREVRJ |
Subject: |
RES: RES: [shell-script] Variaveis no sed |
Date: |
Thu, 6 Jan 2005 13:00:52 -0300 |
Vou pegar uma carona nessa resposta. Eu comecei respondendo a esta pergunta,
calculando que a substituição do $1 $2 desse algum caractere significativo
para o sed, então eu propus (dando tiro no escuro, pq não sabia os valores
de $1 $2) que o Max fizesse o seguinte:
eval sed "'s/zlib/"$1 $2"/g'" .installpath
Agora eu digo: Bullshit! A solução é muito mas simples, pq a barra (/) é o
separador padrão do sed, mas não é obrigatório. Agora que sei que tinham
outras barras no interior do sed, posso afirmar: mude o separador. Veja só
como:
sed "s#zlib#$1 $2#g" .installpath
[ ]s,
Julio
:wq
| -----Mensagem original-----
| De: SuSE List [mailto:address@hidden]
| Enviada em: quinta-feira, 6 de janeiro de 2005 11:37
| Para: address@hidden
| Assunto: Re: RES: [shell-script] Variaveis no sed
|
|
|
| Max, veja só:
|
| arquivo de entrada:
|
| msptst2:/home/vinicius # more teste
| zlib
| wzlibi
| wzlibii
| zlib
|
| script da sua função:
|
| #!/bin/bash
| # add_path_install
| case $1 in
| zlib)
| cat teste | sed "s/^$1/$1 $2/g";
| ;;
| esac
|
| saida:
|
| msptst2:/home/vinicius # ./addpath_install zlib "\/usr\/local"
| zlib /usr/local
| wzlibi
| wzlibii
| zlib /usr/local
|
| O erro :
|
| sed: -e expression #1, char 14: Unknown option to 's'
|
| ocorre por na sua entrada de variável $2 quando vc coloca a variavel
| /usr/local sem as "" (aspas duplas) e sem a \ para inibir o
| caracter /
| o /sed/ vai interpretar um comando errado...imagine *sed
| 's/zlib//usr/local/g'* , onde o /sed/ nao entende esta entrada...
|
| msptst2:/home/vinicius # ./addpath_install zlib */usr/local*
| sed: -e expression #1, char 15: Unknown option to `s'
| msptst2:/home/vinicius # ./addpath_install zlib *\/usr\/local
| *sed: -e expression #1, char 15: Unknown option to `s'
| msptst2:/home/vinicius # ./addpath_install zlib "/usr/local"
| sed: -e expression #1, char 15: Unknown option to `s'
|
| para funcionar como nos exempos acima, o /usr/local deve estar com
| "\/usr\/local" para que na substituição da variavel $2 seja
| feita como
| \/usr\/local e o /sed/ aceite o comando...veja:
|
| msptst2:/home/vinicius # cat teste | sed "s/^zlib/zlib
| \/usr\/local/g";
| zlib /usr/local
| wzlibi
| wzlibii
| zlib /usr/local
|
| coloquei o ^ na frente do zlib na string de busca apenas para
| exemplificar no arquivo de teste que ele busque apenas as strings que
| iniciem com zlib...senao sairia assim:
|
| msptst2:/home/vinicius # more teste
| zlib
| wzlibi
| wzlibii
| zlib
| msptst2:/home/vinicius # cat teste | sed "s/zlib/zlib \/usr\/local/g";
| zlib /usr/local
| wzlib /usr/locali
| wzlib /usr/localii
| zlib /usr/local
|
| Me corrijam se eu estiver falando besteira...
|
| []s
|
| Vinicius
|
|
| Max Leandro Angelo wrote:
|
| >Ola Julio!!
| >
| >Muito obrigado pela explicacao:)
| >
| >eu coloquei entre aspas as variaveis no comando do sed e nao
| funcionou
| >cat .installpath | sed 's/zlib/"$1 $2"/g'
| >
| >tentei assim tbm....
| >cat .installpath | sed "s/zlib/$1 $2/g"
| >mas ele me retorna um erro
| >sed: -e expression #1, char 14: Unknown option to 's'
| >
| >Sera q eu naum to conseguindo aplicar no meu exemplo, o
| conhecimento, da
| >maneira correta? pode me dar um exemplo usando o sed, por favor? :)
| >
| >obrigado!!
| >
| >[]'s
| >
| >Julio Cezar Neves - DATAPREVRJ wrote:
| >
| >
| >
| >>Usando aspas, apóstrofos e barra invertida
| >>Para usar literalmente um caractere especial sem que o
| Shell interprete seu
| >>significado, coloque o caractere entre aspas ou entre
| apóstrofos ou coloque
| >>uma barra invertida antes dele. Seus usos característicos
| são melhores
| >>definidos assim:
| >>* Aspas - Quando se coloca um caractere especial entre
| aspas, o Shell
| >>ignora o seu significado, exceto no caso deste caractere
| ser um cifrão ($),
| >>uma crase (`), ou uma barra invertida(\).
| >>* Apóstrofos - Os apóstrofos são mais restritivos. Todos
| os caracteres
| >>entre apóstrofos são ignorados.
| >>* Barra Invertida - O Shell ignora um e somente um
| caractere que segue
| >>a barra invertida. Quando colocada ao final da linha, o
| Shell interpreta a
| >>barra invertida como um aviso de continuação da linha,
| devolvendo um prompt
| >>secundário (PS2) na linha seguinte da tela. Mas, note bem,
| isto ocorre
| >>porque o <ENTER> não foi visto pelo Shell por estar
| seguindo a contra barra.
| >> Se você for criativo,
| descobrirá muitos usos
| >>para a barra invertida.Vejamos um unalias imediato: suponha
| que você tenha
| >>feito: alias rm='rm -i', caso você execute: \rm <arq>, o
| arquivo <arq> será
| >>removido sem solicitar a confirmação, porque quando você colocou a
| >>contrabarra (\), você escondeu da interpretação do Shell o
| r do comando rm,
| >>então ele não executou o alias.
| >>Exemplos:
| >>$ echo *
| >>Arq1 Arq2 ....
| >>$ echo \\ A 1ª barra invertida inibiu a atuação da 2ª
| >>\
| >>$ echo \ O Shell não viu o <ENTER> e
| >>
| >>
| >>
| >>
| >>><^c> devolveu um prompt secundário (>)
| >>>
| >>>
| >>>
| >>>
| >>$ echo "\" As aspas não inibem a interpretação da \
| >>
| >>
| >>
| >>
| >>><^c>
| >>>
| >>>
| >>>
| >>>
| >>$ echo Estou escrevendo uma linha compacta.
| >>Estou escrevendo uma linha compacta
| >>$ echo Assim não se escreve uma linha
| espacejada.
| >>Assim não se escreve uma linha espacejada. Os brancos são
| >>significativos para o Shell
| >>$ echo "Estou escrevendo uma linha espacejada."
| >>Estou escrevendo uma linha espacejada.
| >>
| >>Então, conforme você viu, para que as variáveis sejam
| interpretadas pelo
| >>shell, é necessário que elas estejam entre aspas e não
| entre apóstrofos.
| >>
| >>Julio
| >>:wq
| >>
| >>| -----Mensagem original-----
| >>| De: Max Leandro Angelo [mailto:address@hidden]
| >>| Enviada em: quinta-feira, 6 de janeiro de 2005 10:45
| >>| Para: address@hidden
| >>| Assunto: [shell-script] Variaveis no sed
| >>|
| >>|
| >>|
| >>| Ola
| >>|
| >>| Estou fazeendo uma funcao q o valor recebe duas variaveis e
| >>| insere num
| >>| comando sed, mas o sed, naum reconhece minhas variaveis, pq
| >>| sua sintaxe
| >>| fica entre ''.... como posso usar variaveis em uma
| sintaxe no sed??
| >>|
| >>| meu script eh o seguinte:
| >>|
| >>| #./bin/bash
| >>|
| >>| addpath_install ()
| >>| {
| >>| case $1 in
| >>| zlib) cat .installpath | sed 's/$1/$(echo
| >>| $1 \t $2/g'
| >>| > teste ;;
| >>| esac
| >>| }
| >>|
| >>| addpath_install zlib /usr/local
| >>|
| >>| --------------------------------------------------------------
| >>| --------------------------------
| >>|
| >>| Minha ideia, eh verificar qual o nome da biblioteca
| (zlib) que foi
| >>| informado, e inserir o caminho informado na segunda variavel,
| >>| dentro do
| >>| arquivo .installpath, substiuindo a linha inteira onde estava
| >>| a primeira
| >>| variavel, pelo conjunto formado pela primeira variavel +
| >>| segunda variavel :)
| >>|
| >>| Esse script somente elimina a primeira variavel, q estah na
| >>| linha... eu
| >>| queria uma q apagasse a linha, e inserisse o conjunto... :(
| >>|
| >>| --
| >>| Max Leandro Angelo
| >>| Suporte Tecnico
| >>| SoftExpert Quality Software
| >>| +55 (47) 2101-9900
| >>| http://www.softexpert.com
| >>|
| >>|
| >>|
| >>|
| ---------------------------------------------------------------------
| >>| Esta lista não admite a abordagem de outras liguagens de
| >>| programação, como perl, C etc. Quem insistir em não seguir
| >>| esta regra será moderado sem prévio aviso.
| >>|
| ---------------------------------------------------------------------
| >>| Sair da lista: address@hidden
| >>|
| ---------------------------------------------------------------------
| >>| Esta lista é moderada de acordo com o previsto em
| >>http://www.listas-discussao.cjb.net
| >>------------------------------------------------------------
| ---------
| >>
| >>Links do Yahoo! Grupos
| >>
| >>
| >>
| >>
| >>
| >>
| >>
| >>
| >>
| >>------------------------------------------------------------
| ---------
| >>Esta lista não admite a abordagem de outras liguagens de
| programação, como perl, C etc. Quem insistir em não seguir
| esta regra será moderado sem prévio aviso.
| >>------------------------------------------------------------
| ---------
| >>Sair da lista: address@hidden
| >>------------------------------------------------------------
| ---------
| >>Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
>>---------------------------------------------------------------------
>>
>>Links do Yahoo! Grupos
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
---------------------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como
perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio
aviso.
---------------------------------------------------------------------
Sair da lista: address@hidden
---------------------------------------------------------------------
Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Links do Yahoo! Grupos