Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

1. Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Guilherme Maia Santos
guisawyer

(usa Ubuntu)

Enviado em 12/11/2013 - 22:30h

Minha dúvida é a seguinte.. eu tenho o seguinte bloco:
%block kgrid_Monkhorst_Pack
1 0 0 0.5
0 1 0 0.5
0 0 1 0.5
%endblock kgrid_Monkhorst_Pack

e queria mudar somente os numeros com o comando sed: para ficar assim por exemplo:
%block kgrid_Monkhorst_Pack
2 0 0 0.5
0 2 0 0.5
0 0 2 0.5
%endblock kgrid_Monkhorst_Pack

Sendo q no arquivo tem vários blocos parecidos, logo eu queria um comando q mudasse somente esse bloco, e não outros q n tem nada haver...
eu tentei algo do tipo:
sed "/^%block kgrid_Monkhorst_Pack/,/^%endblock kgrid_Monkhorst_Pack/s/Monkhorst.*/%block kgrid_Monkhorst_Pack
1 0 0 0.5
0 2 0 0.5
0 0 3 0.5
%endblock kgrid_Monkhorst_Pack/"
Mas os "Enter" q eu dou ele ja da problema...

Não sei se ficou claro a minha dúvida... mas espero q vcs podem me ajudar!!
Desde já muito obrigado!



  


2. Re: Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Guilherme Maia Santos
guisawyer

(usa Ubuntu)

Enviado em 12/11/2013 - 22:44h

Só para ficar mais claro.. eh pq estou montando um script para rodar no Programa Siesta...
que é o seguinte:


for i in $(seq 1 5 100)
do

sed "/^$/block kgrid_Monkhorst_Pack,/^endblock kgrid_Monkhorst_Pack/s/block kgrid_Monkhorst_Pack.*/block kgrid_Monkhorst_Pack
$i 0 0 0.5
0 $i 0 0.5
0 0 $i 0.5
%endblock kgrid_Monkhorst_Pack/" teste.fdf > Teste-$i.fdf

done

Ai para eu n ter q ficar mudando na mão de 1 até 100... queria saber um jeito mais prático de montar esse scritp!
Valeu



3. Re: Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Guilherme Maia Santos
guisawyer

(usa Ubuntu)

Enviado em 12/11/2013 - 23:35h

Consegui de uma forma meio bruta...
eu apaguei esse bloco... e copiei um novo..
desta forma:

sed -i -e '/%block kgrid_Monkhorst_Pack/,/%endblock kgrid_Monkhorst_Pack/ D' $(cat nome.out)-$i.fdf
cat > kteste.txt << !
%block kgrid_Monkhorst_Pack
$i 0 0 0.5
0 $i 0 0.5
0 0 $i 0.5
%endblock kgrid_Monkhorst_Pack
!
cat kteste.txt >> $(cat nome.out)-$i.fdf

e deu certo!!
O bloco vai para o fim do arquivo.. mas como isso n atrapalha na hora de rodar o siesta...
deu certo para o q eu queria!!



4. Re: Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Guilherme Maia Santos
guisawyer

(usa Ubuntu)

Enviado em 13/11/2013 - 00:13h

Não marcarei como resolvido pq vai q no futuro eu precise realmente fazer a substituição deixando o bloco exatamente onde ele estava... e não aparecendo no final do arquivo !!!



5. Re: Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Willian
ThePinkShark

(usa Slackware)

Enviado em 13/11/2013 - 00:19h

Algo que possivelmente ajudaria é que o comando s// do sed aceita o uso de qualquer coisa no lugar de "/" logo poderia escrever algo como:

sed s:batata:manga:



6. Re: Comando sed: Mudar um bloco inteiro de dados! [RESOLVIDO]

Guilherme Maia Santos
guisawyer

(usa Ubuntu)

Enviado em 13/11/2013 - 10:27h

Consegui!!
codigo:

sed -n '/%block kgrid_Monkhorst_Pack/,/%endblock kgrid_Monkhorst_Pack/p' Al.fdf > antigo.txt
cat > kteste.txt << !
%block kgrid_Monkhorst_Pack
h h 0.h
0 ab 0 0.5
0 0 c 0.5
%endblock kgrid_Monkhorst_Pack
!
sed -i -e "s/$(cat "antigo.txt" | head -2 | tail -1 )/$(cat "kteste.txt" | head -2 | tail -1 )/" Al.fdf
sed -i -e "s/$(cat "antigo.txt" | head -3 | tail -1 )/$(cat "kteste.txt" | head -3 | tail -1 )/" Al.fdf
sed -i -e "s/$(cat "antigo.txt" | head -4 | tail -1 )/$(cat "kteste.txt" | head -4 | tail -1 )/" Al.fdf


Sendo o arquivo antigo ele possui o mesmo bloco do Kteste.txt, mas com valores antigos..
e aplicando esses sed... ele realmente substitui...
e não como eu tinha feito antes... q ele apagava o bloco e colava o novo no fim do arquivo!!

Valeu!!
Até






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts