[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Sed - troca apenas da primeira ocorrência
From: |
Tiago Barcellos Peczenyj |
Subject: |
Re: [shell-script] Sed - troca apenas da primeira ocorrência |
Date: |
Tue, 29 Apr 2008 21:16:55 -0300 |
Não sei se me fiz entender, vou esclarecer alguns pontos.
Os comandos do sed são executados linha-a-linha e o que aconteceu em
uma linha não afeta as proximas, exceto quando paramos o fluxo ou
pulamos para a proxima linha. Na maioria das linguagens isso seria
feito via um if, mas não há if em sed :(
Porém, se eu soubesse qual a linha que eu quero alterar, isto é, qual
a primeira linha que possui a palavra "vazio", a minha vida é
simplificada :)
sed -n '/vazio/{=;q}' arquivo
isso imprime, na ocorrencia de "vazio", o numero da linha (=) e, em
seguida, termina o script (q).
agora basta executar o comando
sed "NUMEROs/vazio/qqcoisa/" arquivo # na linha NUMERO, execute...
Que poderia ser feito assim:
sed "$( comando )s/vazio/qqcoisa/" xxx
Ou
LINHA=$( comando )
sed "${LINHA}s/vazio/qqcoisa/" xxx
Espero que seja util
T.
2008/4/29 Tiago Barcellos Peczenyj <address@hidden>:
> Esse é o problema do comando q no lugar errado
>
> $ cat xxx
>
> 321
> 852
> vazio
> vazio
> vazio
>
> $ sed -n '/vazio/{=;q}' xxx
> 3
>
> $ sed "$(sed -n '/vazio/{=;q}' xxx)s/vazio/qqcoisa/" xxx
> 321
> 852
> qqcoisa
> vazio
> vazio
>
> Sacou?
>
> 2008/4/29 César Vianna <address@hidden>:
>
>
> >
> >
> >
> >
> >
> >
> > ok.
> >
> > mas o resultado esperado seria:
> >
> > teste
> > teste
> > qualquercoisa
> > a
> > a
> >
> > Teria que apenas substituir a primeira linha encontrada e preservar as
> > demais
> >
> > 2008/4/29 Flavio Junior <address@hidden>:
> >
> >
> > > q
> > >
> > > [root@catatau:~]# echo -e 'teste\nteste\na\na\na'
> > > teste
> > > teste
> > > a
> > > a
> > > a
> > > [root@catatau:~]# echo -e 'teste\nteste\na\na\na' | sed
> > > '/a/{s/.*/qualquercoisa/;q}'
> > > teste
> > > teste
> > > qualquercoisa
> > > [root@catatau:~]#
> > >
> > > mim ser preguiçoso..
> > >
> > > Pra casar vazio pode usar: ^$
> > >
> > > --
> > >
> > > Flavio do Carmo Junior
> > >
> > > 2008/4/29 César Vianna <address@hidden <cesar.vianna%40gmail.com>
> >
> > > >:
> > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Tenho um arquivo texto com o seguinte conteúdo
> > > >
> > > > 321
> > > > 852
> > > > vazio
> > > > vazio
> > > > vazio
> > > >
> > > > Quero trocar a primeira ocorrência de "vazio" por "qualquercoisa"
> > > >
> > > > Fiz assim
> > > >
> > > > sed "s/vazio/qualquercoisa/" estac.txt
> > > >
> > > > e
> > > >
> > > > sed "s/vazio/qualquercoisa/1" estac.txt
> > > >
> > > > Mas em ambas opções ele troca todas as ocorrências de vazio
> > > >
> > > > Sei que tem alguma opção para interromper na primeira ocorrência, mas
> > > não
> > > > estou lembrando. Como diz o Júlio: "Para o sed não ser guloso"
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
>
>
>
> --
> Tiago B Peczenyj
> Linux User #405772
>
> http://peczenyj.blogspot.com/
> "what does not kill us makes us stronger"
>
--
Tiago B Peczenyj
Linux User #405772
http://peczenyj.blogspot.com/
"what does not kill us makes us stronger"