Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

1. Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 28/07/2016 - 08:02h

Olá a todos,

As minhas bases em shell script são muito poucas, mas tenho lido este fórum https://jneves.wordpress.com/2008/03/05/papo-de-botequim-parte-2-2/, e estou a começar a perceber a dinâmica da coisa.
Procuro a v/ajuda e opinião. Tenho cerca de 100 ficheiros html, dos quais preciso extrair a informação que está entre a tag <body> e </body>. Esse conteúdo deverá escrito num novo ficheiro, com determinado nome, por exemplo "file-01.php".

O algoritmo será desta forma:

1-Listar todos os ficheiros existentes no directorio e carregar o seu nome para um array;
2-Ler cada posição do array e para cada uma delas (Isto será um loop):
2.1-Fazer o match na palavra <body> e </body> e copiar o que se encontra no seu interior para variável $conteudo;
2.2-Ler o nome do ficheiro, na posição do array que foi utilizado no passo 2.1, e criar um ficheiro com o nome "file-xx.php" - onde xx será o numero que for encontrado na posição do array utilizado no passo 2.1 (o valor carregado no array será algo como "a85.php";
2.3-Nesse ficheiro, criado no ponto 2.2, colocar o valor da variável $conteudo;
3-Fim

Basicamente é isto. O que vou precisar para cada ponto:
1-Listar todos os ficheiros no interior de um diretório e carregar os seus nomes para um array;
2.1-Fazer com que o que foi encontrado seja carregado para uma variável, neste caso a variável $conteudo;
2.2-Extrair apenas o valor numérico que está na posição do array a ser utilizado e , com o comando touch, criar um arquivo com o nome "file-xx.php";
2.3-Fazer um echo $conteudo >> ficheiro criado anteriormente;

Pelo que consigo perceber de shell script a "inteligencia" do programa está nos 4 pontos que passei, serão esses que terei que estudar.
Acham que estou certo? Vocês adicionavam mais alguma coisa?

Caso a explicação tenha ficado complicado por favor digam que tento explicar novamente!
Obrigado e boa programação!



  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/07/2016 - 17:18h

ede_linux escreveu:

msoliver

hoo, deixo-me intrigado :)
Obrigado pela atenção, a sua abordagem contribui e muito para a minha aprendizagem!

Vamos lá! :)

Após ponderar sobre a sua resposta tive esta abordagem ao algoritmo:

1-Para todos os ficheiros existentes no diretório, com extensão .php (este pormenor é apenas para dar mais liberdade ao utilizador, vamos:
1.1-apagar tudo que está antes e depois do padrão "body>" e "<body";
1.2-Alterar o nome do ficheiro do caractere "a" para "file-";

E voilá! Tenho um algoritmo bem mais simples.
Apenas terei que me preocupar com três tarefas:
1-Conseguir executar o comando para todos os ficheiros que existem no diretório com o critério da extensão ".php";
2-Apagar o conteúdo com base no match do padrão "body>" e "<body";
3-Alterar, no nome, o padrão "a" para "file-"

É isto?
Nota:
Bem o meu professor de algoritmia nos dizia:
"O algoritmo é a base do sucesso na programação!"
Olhem só como as coisas podem mudar de um momento para o outro. Imaginem o trabalho que eu teria deitado fora! (Este comentário é para a malta que passa por cima do algoritmo!) :)

Obrigado pela ajuda

______________________________________________
Ede, boa tarde!
Melhorou , mas ainda tem "COMANDOS DESNECESSÁRIOS", por exemplo:
1.1-apagar tudo que está antes e depois do padrão "body>" e "<body";
"PEGUE" diretamente o que esta entre as "tags" <body> ...</body>


A minha lógica é a seguinte:
Vamos lá:
1 - LISTANDO os *.php e executando um comando com CADA um DELES

for X in $(ls -1 *.php);do
echo "$X"
done



3 - GERA NOME p/ o NOVO_ARQUIVO:

AN=$(sed 's/^a/file-/' <<< "$X")



Laço testado, NOME p/ o NOVO_ARQUIVO, OK . . .
COMANDO para "PEGAR" o CONTEúDO entre as tags <body> e </body>, e enviar para um ARQUIVO NOVO.
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AN"  


JUNTANDO TUDO . . . :

for X in $(ls -1 *.php);do
AN=$(sed 's/^a/file-/' <<< "$X")
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AN"
done


OBS.:
Fiz um "passo a passo, para melhor entendimento.

Se a RESPOSTA FOI ÚTIL e ESCLARECEDORA, MARQUE-A COMO A MELHOR. . .


Att.:
Marcelo Oliver





3. Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias

Edmar
edmarssouzap

(usa Debian)

Enviado em 28/07/2016 - 11:10h

Bom dia!!!

É hilário seu post: "Boa programação?". Achei que nós que ajudamos que devia dizer isto e não o contrário. kkkk

Bem, cara, mostre um exemplo de saída mais ou menos que você queira, que vou procurar te ajudar.

Até.



4. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 28/07/2016 - 11:23h

Sim, são as minha saudações de geek :P

A entra será algo assim:

<!doctype html>
<html lang="pt">
<head>
<meta charset="utf-8" />
<title>A35</title>
<link id="linkstyle" rel='stylesheet' href='../_css/markdown1.css'/>
</head>
<body>

<a href="../index.html">go back...</a>
<h1>Start up the nfs server on the RPI (this situation should be resolved)</h1>

<h2>Commands:</h2>
<p>
sudo service rpcbind start<br/>
sudo service nfs-kernel-server restart<br/>
After this command ran it is already possible see mounted drive, in pc client, through this command:</p>

</body>
</html>


A saida deverá ser apenas o que está entre as tags body:

<a href="../index.html">go back...</a>
<h1>Start up the nfs server on the RPI (this situation should be resolved)</h1>

<h2>Commands:</h2>
<p>
sudo service rpcbind start<br/>
sudo service nfs-kernel-server restart<br/>
After this command ran it is already possible see mounted drive, in pc client, through this command:</p>


Obrigado pela ajuda e boa programação :D


5. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/07/2016 - 13:07h


ede_linux escreveu
O algoritmo será desta forma:

1-Listar todos os ficheiros existentes no directorio e carregar o seu nome para um array;
2-Ler cada posição do array e para cada uma delas (Isto será um loop):
2.1-Fazer o match na palavra <body> e </body> e copiar o que se encontra no seu interior para variável $conteudo;
2.2-Ler o nome do ficheiro, na posição do array que foi utilizado no passo 2.1, e criar um ficheiro com o nome "file-xx.php" - onde xx será o numero que for encontrado na posição do array utilizado no passo 2.1 (o valor carregado no array será algo como "a85.php";
2.3-Nesse ficheiro, criado no ponto 2.2, colocar o valor da variável $conteudo;
3-Fim


Pelo que consigo perceber de shell script a "inteligencia" do programa está nos 4 pontos que passei, serão esses que terei que estudar.
Acham que estou certo? Vocês adicionavam mais alguma coisa?

______________________________________________________
ede_linux, boa tarde!

Para contribuir com o seu aprendizado, não vou colocar o script "feito/pronto"!
Reveja a "LÓGICA" e simplifique-a!
Evite REDUNDÂNCIA!

Pelo que consigo perceber de shell script a "inteligencia" do programa está nos 4 pontos que passei,
Concordo com "metade" do "ponto 1" e "metade" do "ponto 2.1", o restante é desnecessário!!!

Bom aprendizado.

Att.:
Marcelo Oliver








6. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/07/2016 - 13:24h

Eu fazia essas coisas em Perl.

Abaixo tem um código pouco claro, que está quase fazendo isso.
Falta algum ajuste.

#!/usr/bin/perl

use strict;
use warnings;

my $arqent = $ARGV[0];
my $arqsai = $ARGV[1];

open(my $ARQ, '<:encoding(UTF-8)', $arqent) or die 'nao abri o arquivo de entrada';

my @linha;
my $flag = 0;

while (<$ARQ>) {

$flag = 1 if $_ eq "<body>" ;

push @linha, $_ if $flag == 1 && $_ ne "";

$flag = 0 if $_ eq "</body>";

}

close ($ARQ);


open(my $ARQ, '>:encoding(UTF-8)', $arqsai) or die 'nao abri o arquivo de saida';

while (@linha) {

print $ARQ $_ if $_ ne "";

}

close $ARQ;

0



----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



7. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias

Ede
ede_linux

(usa Ubuntu)

Enviado em 28/07/2016 - 13:39h

msoliver

hoo, deixo-me intrigado :)
Obrigado pela atenção, a sua abordagem contribui e muito para a minha aprendizagem!

Vamos lá! :)

Após ponderar sobre a sua resposta tive esta abordagem ao algoritmo:

1-Para todos os ficheiros existentes no diretório, com extensão .php (este pormenor é apenas para dar mais liberdade ao utilizador, vamos:
1.1-apagar tudo que está antes e depois do padrão "body>" e "<body";
1.2-Alterar o nome do ficheiro do caractere "a" para "file-";

E voilá! Tenho um algoritmo bem mais simples.
Apenas terei que me preocupar com três tarefas:
1-Conseguir executar o comando para todos os ficheiros que existem no diretório com o critério da extensão ".php";
2-Apagar o conteúdo com base no match do padrão "body>" e "<body";
3-Alterar, no nome, o padrão "a" para "file-"

É isto?

Nota: Bem o meu professor de algoritmia nos dizia "O algoritmo é a base do sucesso na programação!" Olhem só como as coisas podem mudar de um momento para o outro. Imaginem o trabalho que eu teria deitado fora! (Este comentário é para a malta que passa por cima do algoritmo!) :)

Obrigado pela ajuda


8. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 28/07/2016 - 13:45h

listeiro_037

Obrigado pela ajuda, mas Perl não percebo nada!
Por acaso estou a estudar Python, nos tempos livres! Pelo que percebo o Perl está ao mesmo nível de C, certo? Também acho, não tenho a certeza, que Perl como o Python nasceram do C, mas o Python foi desenvolvida para ser uma linguagem de mais alto nível, certo?

Obrigado


9. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/07/2016 - 14:44h

Perl lembra C por causa de algumas instruções e dos { e }.

Python tem estrutura semelhante que toda linguagem tem, mas usa indentação para blocos.

Pensando agora enxerguei como fazer em shell script.

Essa coisa de pegar linhas em array eu brincava com Perl e AWK.

Mas os programas eram mais simples que o de exemplo.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



10. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 28/07/2016 - 20:22h

msoliver escreveu:

ede_linux escreveu:

msoliver

hoo, deixo-me intrigado :)
Obrigado pela atenção, a sua abordagem contribui e muito para a minha aprendizagem!

Vamos lá! :)

Após ponderar sobre a sua resposta tive esta abordagem ao algoritmo:

1-Para todos os ficheiros existentes no diretório, com extensão .php (este pormenor é apenas para dar mais liberdade ao utilizador, vamos:
1.1-apagar tudo que está antes e depois do padrão "body>" e "<body";
1.2-Alterar o nome do ficheiro do caractere "a" para "file-";

E voilá! Tenho um algoritmo bem mais simples.
Apenas terei que me preocupar com três tarefas:
1-Conseguir executar o comando para todos os ficheiros que existem no diretório com o critério da extensão ".php";
2-Apagar o conteúdo com base no match do padrão "body>" e "<body";
3-Alterar, no nome, o padrão "a" para "file-"

É isto?
Nota:
Bem o meu professor de algoritmia nos dizia:
"O algoritmo é a base do sucesso na programação!"
Olhem só como as coisas podem mudar de um momento para o outro. Imaginem o trabalho que eu teria deitado fora! (Este comentário é para a malta que passa por cima do algoritmo!) :)

Obrigado pela ajuda

______________________________________________
Ede, boa tarde!
Melhorou , mas ainda tem "COMANDOS DESNECESSÁRIOS", por exemplo:
1.1-apagar tudo que está antes e depois do padrão "body>" e "<body";
"PEGUE" diretamente o que esta entre as "tags" <body> ...</body>


A minha lógica é a seguinte:
Vamos lá:
1 - LISTANDO os *.php e executando um comando com CADA um DELES

for X in $(ls -1 *.php);do
echo "$X"
done



3 - GERA NOME p/ o NOVO_ARQUIVO:

AN=$(sed 's/^a/file-/' <<< "$X")



Laço testado, NOME p/ o NOVO_ARQUIVO, OK . . .
COMANDO para "PEGAR" o CONTEúDO entre as tags <body> e </body>, e enviar para um ARQUIVO NOVO.
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AN"  


JUNTANDO TUDO . . . :

for X in $(ls -1 *.php);do
AN=$(sed 's/^a/file-/' <<< "$X")
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AN"
done


OBS.:
Fiz um "passo a passo, para melhor entendimento.

Se a RESPOSTA FOI ÚTIL e ESCLARECEDORA, MARQUE-A COMO A MELHOR. . .


Att.:
Marcelo Oliver


Excelente, obrigado pela ajuda!
Tive necessidade de converter para php, por isso cá vai o código (não sei se é a melhor solução, mas como ainda não percebo bem as coisas, vai assim):

#!/bin/bash

for X in $(ls -1 *.html);do
AN=$(sed 's/^A/file-/' <<< "$X")
AD=$(sed 's/html/php/g' <<< "$AN")
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AD"
done


Coisas a estudar
Comando sed e seus parametros, O loop percebi, mas tenho que treinar!

Obrigado mais uma vez e vamos lá estudar ;)





11. Re: Extrair dados e criar ficheiros com nome em função do antigo - algoritmo e ideias [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/07/2016 - 21:22h

ede_linux escreveu:

#!/bin/bash
for X in $(ls -1 *.html);do
AN=$(sed 's/^A/file-/' <<< "$X")
AD=$(sed 's/html/php/g' <<< "$AN")
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AD"
done


Coisas a estudar
Comando sed e seus parâmetros, O loop percebi, mas tenho que treinar!
Obrigado mais uma vez e vamos lá estudar ;)

----------------------------------------------------------------------
Vamos simplificar . . .
#!/bin/bash
for X in $(ls -1 *.html);do
AD=$(sed 's/^A/file-/;s/html/php/' <<< "$X") #O COMANDO sed para substituição (sed 's///') permite essa sintaxe.
sed -n '/<body>/,/<\/body>/p' "$X"|sed '/body>/d' > "$AD"
done
[/code]

Em
aurelio.net 
Você encontra ótimo material sobre SED, REGEX, e muito mais.....
Não deixe de ver:
http://aurelio.net/shell/canivete/ 


Att.:
Marcelo Oliver










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts