[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RES: [shell-script] Variaveis no sed
From: |
SuSE List |
Subject: |
Re: RES: [shell-script] Variaveis no sed |
Date: |
Thu, 06 Jan 2005 11:36:47 -0200 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.2) Gecko/20040803 |
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]