shell-script-pt
[Top][All Lists]
Advanced

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

Re: [shell-script] Sed :: Não substituir entre dois intervalos.


From: Rodrigo Boechat
Subject: Re: [shell-script] Sed :: Não substituir entre dois intervalos.
Date: Sun, 14 Jul 2013 15:40:02 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130623 Thunderbird/17.0.7

Alyson e Fabio.

Eu não tinha recebido a resposta de vocês.
Ela chegou só hoje.

Fabio, obrigado pela dica.
Mas testei e não funcionou.

Com "escape" nos "()":
sed '\(/\#f1\#/,/\#ff1\#/ | /\#f2\#/,/\#ff2\#/\) ! { s/qwery/TESTE/g }' 01 sed: -e expressão #1, caractere 65: A expressão regular do endereço está inacabada (falta a /)

Sem "escape" nos "()":
sed '(/\#f1\#/,/\#ff1\#/ | /\#f2\#/,/\#ff2\#/) ! { s/qwery/TESTE/g }' 01
sed: -e expressão #1, caractere 1: comando desconhecido: `('

* * * * * * * * * * * * * * * * * * * *

Alyson, obrigado pelo link.
A maioria dos resultados dispostos ali eu já tinha visitado, só que através de termos de pesquisas diferentes.

De qualquer forma, eu já tinha chegado na expressão que você me indicou e adaptado ela para não fazer as substituições dentro do intervalo. Mas o que eu precisava era uma expressão que reconhecesse múltiplos intervalos, pois se eu fizesse:

sed '
/#f1#/,/#ff1#/ ! { s/qwerty/TESTE/g }
/#f2#/,/#ff2#/ ! { s/qwerty/TESTE/g }
' 01

A primeira que reconheceria o f1 e ff1 não reconheceria o f2 e ff2, assim uma entraria erroneamente no intervalo da outra e substituiria tudo.
Compreendeu o dilema?

Eu consegui, com alguma dor de cabeça chegar em nisso:

sed '/\#f1\#/ ! { /\#ff1\#/ ! { /\#f2\#/ ! { /\#ff2\#/ ! { s/qwerty/TESTE/g } } } }' 01

Não sei dizer se é a melhor solução, mas está funcionando perfeitamente aqui.
:)

Abraços!

Em Dom 14 Jul 2013 01:38:04 BRT, Rodrigo Boechat escreveu:
Depois de muito bater cabeça, cheguei na solução:

sed '/\#f1\#/ ! { /\#ff1\#/ ! { /\#f2\#/ ! { /\#ff2\#/ ! {
s/qwerty/TESTE/g } } } }' 01

Aqui funcionou como o esperado.
Alfredo, obrigado! Foi seu link que me deu pistas para chegar na solução.

Acabou que não precisou de controle de tudo que eu achava que iria
precisar.

Muito obrigado!

Em Sáb 13 Jul 2013 16:34:15 BRT, Rodrigo Boechat escreveu:
Alfredo, obrigado pela resposta!

Eu estive lendo.
Aliás muito bom o material disposto ali.

Infelizmente não consegui ainda fazer funcionar.
Imaginando que eu terei que usar controle de fluxo e marcadores,
comecei testes baseado neste aqui:

3.16. Extrair trecho que pode ou não estar na mesma linha
sed -n '/segundo/{:a;/quarto/!{N;ba;};p;}'

Se eu entendi bem o exemplo acima funciona assim:
/segundo/ = Procura por segundo;
{ = Abre bloco de comandos;
:a; = cria um marcador chamado "a";
/quarto/ = procura por quarto;
! = nega a procura anterior;
{ = abre um segundo bloco de comandos;
N; = junta com a próxima linha;
ba; = volta a execução para o marcador "a";
}; = fecha o segundo bloco de comandos;
p; = imprime caso encontre "quarto";
} = fecha o primeiro bloco de comandos.

Mas tudo que eu fiz nada funcionou.
Desconfio que não compreendi a lógica de funcionamento ainda.

Se você souber, pode me ensinar?

Grato!


Em Sáb 13 Jul 2013 09:44:52 BRT, Alfredo Casanova escreveu:
De cabeça n consigo resolver, mas tem boas referências do sed aqui:

http://thobias.org/doc/sosed.html

Que podem te ajudar
Em 13/07/2013 06:32, "Rodrigo Boechat"
<address@hidden>
escreveu:

**


Pessoal, bom dia!

Como eu faria para não aplicar substituições entre dois intervalos?

Exemplo:

cat >01<<EOF
qwerty
qwerty
#f1#qwerty
qwerty#ff1#
qwerty
#f2#qwerty#ff2#
qwerty
qwerty
qwerty
EOF

Tentando da forma que descrevo abaixo, obtive o seguinte erro:
sed: -e expressão #1, caractere 29: comando desconhecido: `|'

sed '
/^\#f1\#/,/^\#ff1\#/ | /^\#f2\#/,/^\#ff2\#/ ! {
s/qwerty/TESTE/g
}' 01

Andei pesquisando na net e ainda não achei algo parecido.
Preciso encontrar um intervalo, #f1# e#ff1#, ou o outro, #f2# e #ff2#,
para não executar o s/qwerty/TESTE/g, dentro deles.

Alguém sabe como me ajudar?

Desde jáagradeço!

Rodrigo Boechat

[As partes desta mensagem que não continham texto foram removidas]





[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
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil

Links do Yahoo! Grupos





reply via email to

[Prev in Thread] Current Thread [Next in Thread]