Discussion:
Capturar intervalo de linhas separadas por alguma expressao
cleberson
2010-05-26 20:16:30 UTC
Permalink
Srs.,

Boa tarde!

Gostaria de uma ajuda para solucionar este desafio(pra min..rs).
Desejo capturar um intervalo de linhas separadas por chaves.

ex:

#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha

Gostaria de saber qual comando posso utilizar para que seja possivel jogar o que esta entre chaves para alguma variavel:

linha1
linha2
linha3

desde já agradeço atenção!

att,
Cleberson.
Márcio Gil
2010-05-26 21:37:36 UTC
Permalink
Post by cleberson
Boa tarde!
Gostaria de uma ajuda para solucionar este desafio(pra min..rs).
Desejo capturar um intervalo de linhas separadas por chaves.
#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha
Gostaria de saber qual comando posso utilizar para que seja
linha1
linha2
linha3
desde já agradeço atenção!
att,
Cleberson.
Ve se assim complica:

$ cat temp.txt
#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha

$ sed -n '/^teste{$/{N;s/^.*\n//;:a;N;/\n}$/!{ba};s/\n}$//;p}' temp.txt
linha1
linha2
linha3
$

Por via das duvidas vou tentar explicar:

/^teste{$/ # Se encontrar a linha 'teste{'
{
N; # Junte com a linha seguinte
s/^.*\n//; # Retire a primeira linha (a linha 'teste{')
:a; # Inicio do laco
N; # Junte com a linha seguinte
/\n}$/!{ba}; # Enquanto nao encontrar a linha '}'
s/\n}$//; # Entao remova a ultima linha (a linha '}')
p # E exiba o resultado
}

A opcao -n do sed desliga a impressao automatica, so imprimindo ao
encontrar o comando 'p'.

Marcio Gil.
cleberson
2010-05-26 22:07:06 UTC
Permalink
Marcio Gil,

Muitíssimo obrigado cara...fenomenal..show de bola a solução...não ia conseguir chegar a esse resultado nunca...rsrs

Se vc tiver a fonte que vc aprendeu a fazer isso e não se importar em compartilhar seria bom..rs

muito obrigado novamente!

Cleberson
Post by Márcio Gil
Post by cleberson
Boa tarde!
Gostaria de uma ajuda para solucionar este desafio(pra min..rs).
Desejo capturar um intervalo de linhas separadas por chaves.
#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha
Gostaria de saber qual comando posso utilizar para que seja
linha1
linha2
linha3
desde já agradeço atenção!
att,
Cleberson.
$ cat temp.txt
#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha
$ sed -n '/^teste{$/{N;s/^.*\n//;:a;N;/\n}$/!{ba};s/\n}$//;p}' temp.txt
linha1
linha2
linha3
$
/^teste{$/ # Se encontrar a linha 'teste{'
{
N; # Junte com a linha seguinte
s/^.*\n//; # Retire a primeira linha (a linha 'teste{')
:a; # Inicio do laco
N; # Junte com a linha seguinte
/\n}$/!{ba}; # Enquanto nao encontrar a linha '}'
s/\n}$//; # Entao remova a ultima linha (a linha '}')
p # E exiba o resultado
}
A opcao -n do sed desliga a impressao automatica, so imprimindo ao
encontrar o comando 'p'.
Marcio Gil.
Sérgio
2010-05-27 11:08:16 UTC
Permalink
cat file.txt | awk '/teste{/,/}/' | grep -v '{\|}' > file.new

geramos um novo arquivo 'file.new'

leitura do arquivo com cat
com awk pegamos da chave de abertura até a chave de fechamento
com o 'grep -v' descartamos as linhas contendo as chaves de abertura
e fechamento.
Post by cleberson
Srs.,
Boa tarde!
Gostaria de uma ajuda para solucionar este desafio(pra min..rs).
Desejo capturar um intervalo de linhas separadas por chaves.
#arquivo teste
primeira_linha
teste{
linha1
linha2
linha3
}
ultima_linha
linha1
linha2
linha3
desde já agradeço atenção!
att,
Cleberson.
voyeg3r@yahoo.com.br [shell-script]
2017-09-17 21:09:28 UTC
Permalink
Se o padrão do começo de linha for recorrente você pode tentar isso:

awk '/^linha/' file

começo de linha --> ^

Usando o vim podemos usar o seguinte comando:

g/^[^l]/d

^ começo de linha seguido de uma lista negada contendo letra l
a letra d no final indica deleção

e se forem muitos arquivos? digamos que sejam arquivos com extensão "x"

abra o vim na pasta contendo os arquivos e digite:

" esse comando do vim permite usar o comando argdo sobre todos os buffers abertos sem pedir confirmação
:set hidden

" Esse comando abre todos os arquivos *.x do diretório atual
:args *.x

"O comando
:argdo g/^[^l]/d

:argdo update

" Pra reverter possíveis erros na execuação do comando
:silente argdo edit!

o comando :edit! do vim reverte o arquivo ao seu estado original

OBS: No momento não estou lembrando como usar /pattern/+1, /pattern/-1 em comandos linux, mas estou certo de que há um comando que usa esse tipo de intervalo, se não me engano é o próprio vim. caso me lembre volto a postar uma resposta.
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2017-09-18 12:24:39 UTC
Permalink
Fala Voyeg3r,
Antes de mais nada bem vindo de volta, vc andou sumido... Tavas programando
em VB? ;) kkk

Vai aí uma dica rápida sobre endereçamanto sob o sed:

O basicão:
/EXPR1/,/EXPR2/ Onde EXPR pode ser cadeia ou expressão regular
NINI,NFIM Número inicial e final
/CAD1/,+NUM Da cadeia CAD1 até NUM linhas após
NINI, +NUM Da linha número NINI até NUM linhas após

Um pouquinho mais incrementado:
/CAD1/,~NUM Da cadeia CAD1 até próxima linha múltipla de NUM
NINI, ~NUM Da linha NINI até próxima linha múltipla de NUM
NINI~INCR Da linha NINI, incrementando de INCR em INCR

*ATENÇÃO AMIGOS DO LINUX (principalmente os de Curitiba e Arredores)*
Deem uma olhada em https://www.facebook.com/pg/forumslcuritiba/photos/.
É tudo 0800, inclusive o cafezinho ;) Compareça e ajude-nos a divulgar o
Software Livre. Basta inscrever-se e participar. Garanto a excelência do
evento. Te vejo lá.

Em Setembro/Outubro darei um treinamento de 40 horas no RJ e em BSB
sobre Programação em Shell, com imersão em Expressões Regulares e
dicas de YAD. Para mais detalhes acesse goo.gl/JkWmBx

Em Dezembro um curso com este mesmo conteúdo/carga horária será
lecionado em SP. Maiores detalhes neste site.
<https://www.4linux.com.br/curso/programacao-em-shell-script>

Abcs,
Julio

*Damos treinamento em sua empresa por **um preço, *
*no mínimo, 50% mais barato que qualquer curso,*
*com certificado e nota fiscal.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by ***@yahoo.com.br [shell-script]
awk '/^linha/' file
começo de linha --> ^
g/^[^l]/d
^ começo de linha seguido de uma lista negada contendo letra l
a letra d no final indica deleção
e se forem muitos arquivos? digamos que sejam arquivos com extensão "x"
" esse comando do vim permite usar o comando argdo sobre todos os buffers
abertos sem pedir confirmação
:set hidden
" Esse comando abre todos os arquivos *.x do diretório atual
:args *.x
"O comando
:argdo g/^[^l]/d
:argdo update
" Pra reverter possíveis erros na execuação do comando
:silente argdo edit!
o comando :edit! do vim reverte o arquivo ao seu estado original
OBS: No momento não estou lembrando como usar /pattern/+1, /pattern/-1 em
comandos linux, mas estou certo de que há um comando que usa esse tipo de
intervalo, se não me engano é o próprio vim. caso me lembre volto a postar
uma resposta.
Loading...