Autor Tópico: Separar partes de String em Bash por Regex  (Lida 7302 vezes)

Offline euconectei

  • Usuário Ubuntu
  • *
  • Mensagens: 9
    • Ver perfil
Separar partes de String em Bash por Regex
« Online: 10 de Outubro de 2013, 12:12 »
Pessoal,
Estou a alguns dias procurando uma solução para este problema, mas não a encontrei ainda.
Tenho um arquivo com textos onde em cada linha tenho, por exemplo (dados fictícios):
Citar
PUBLICACAO - PUBDPTO 123/2013 XXXXXX XXXXX XXXX 09/10/2013 X xxxxx xxxxx xxxx XXXXX Chamar FULANO DE TAL, xxxxxxx, para olhar o teste, a partir de 05/10/2013, xxxx xxxxx xxxxx.
PUBLICACAO - PUBDPTO112/2013 XXXXXX XXXXX XXXX 01/08/2012 X xxxxx xxxxx xxxx XXXXX chamar JOÃO DA SILVA, xxxxxxx, para criar ferramenta, a partir de 27/07/2013, xxxx xxxxx xxxxx.
Então o problema é que tenho que extrair algo dessa forma:
Citar
123/2013,FULANO DE TAL,olhar o teste,05/10/2013
112/2013,JOÃO DA SILVA,criar ferramenta, 27/07/2013
Estou fazendo testes com Bash com Regex. Seguem as Regex:
Citar
/* --- Resultado: 000/0000 --- */
([0-9]{3})\/([0-9]{4})

/* --- Resultado: "de 00/00/0000" --- */
(([de]{2})\s)([0-9]{2})\/([0-9]{2})\/([0-9]{4})

/* --- Resultado: "Chamar NOME SOBRENOME" ou "chamar NOME SOBRENOME" --- */
(([Cchamar]){6}\s((([A-ZÀ-Ü]){2,})(\s)?()){5,})

/* --- Resultado: "para (...)" fim em ponto final --- */
(([para]{4}\s).*[.])
Quanto ao código, coloquei tentei filtrar por linha, mas não consigo pegar as partes que preciso da linha, sempre me retorna a linha inteira.
Código: [Selecionar]
while read line
do
    if [[ $line =~ (^([0-9]{3})\/([0-9]{4})) ]]
    then
        #como pegar somente a parte que utilizei na filtragem?
    fi
done < $1

Não vejo como ideal utilizar por trecho de linha, como estou fazendo:
Código: [Selecionar]
while read line
do
     trechos=($line)
     for trecho in ${trechos[@]}
          if [[ $trecho =~ (^([0-9]{3})\/([0-9]{4}))
          then
               #aqui está meu problema, como pego o que foi filtrado?
               #entendo que desta forma perco a posição do texto, então não vejo como ideal
          fi
     done
done < $1
obs.:
1) Coloquei em caixa-alta pq isso faz diferença na busca
2) Os "xxxx" são textos que estão lá mas não fazem diferença aqui
« Última modificação: 10 de Outubro de 2013, 12:30 por euconectei »

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Separar partes de String em Bash por Regex
« Resposta #1 Online: 10 de Outubro de 2013, 17:37 »
Com a comparação, você sabe se casou ou não a expressão regular, e o que casar vai pro array BASH_REMATCH, um exemplo de uso: http://www.linuxjournal.com/content/bash-regular-expressions

De qualquer forma, porque não usa awk? Ou mesmo perl.

Offline euconectei

  • Usuário Ubuntu
  • *
  • Mensagens: 9
    • Ver perfil
Re: Separar partes de String em Bash por Regex
« Resposta #2 Online: 11 de Outubro de 2013, 09:47 »
Com a comparação, você sabe se casou ou não a expressão regular, e o que casar vai pro array BASH_REMATCH, um exemplo de uso: http://www.linuxjournal.com/content/bash-regular-expressions

De qualquer forma, porque não usa awk? Ou mesmo perl.

Eu sou novo no shell, estou a 1 semana tentando aprender isto. Ainda não sei escolher entre as ferramentas, ainda estou no processo de conhecer as ferramentas. Vou dar uma olhada em awk (de novo) e perl.

Awk eu até tentei, mas me retornava vazio sempre. Com isso, preferi mudar e cheguei a este ponto que estou agora.

Obrigado!

Offline euconectei

  • Usuário Ubuntu
  • *
  • Mensagens: 9
    • Ver perfil
Re: Separar partes de String em Bash por Regex
« Resposta #3 Online: 11 de Outubro de 2013, 14:58 »
Pessoal,
Obrigado pelo apoio. Mas depois de uma semana tentando, decidi fazer em PHP, pois eu já tenho uma certa experiência em PHP. Fiz tudo o que precisava em 1 hora.

Como era somente leitura de arquivo e criação de uma planilha, fiz um PHP que me retornava uma tabela. A partir disso foi somente copiar e colar. =)

Não estou postando o código para não entrar "poluir" aqui. Caso achem interessante, só falar que eu coloco.

Abc! Vlw pelo apoio!

Offline Arthur Bernardes

  • Usuário Ubuntu
  • *
  • Mensagens: 4.692
    • Ver perfil
Re: Separar partes de String em Bash por Regex
« Resposta #4 Online: 11 de Outubro de 2013, 15:05 »
Eu me interesso amigo!!  :)

Offline euconectei

  • Usuário Ubuntu
  • *
  • Mensagens: 9
    • Ver perfil
Re: Separar partes de String em Bash por Regex
« Resposta #5 Online: 11 de Outubro de 2013, 15:15 »
Opa!

Tá aí:

Código: [Selecionar]
<table border="1">
<thead>
<th>PUBDPTO</th>
<th>Dt da Designação</th>
<th>Funcionário</th>
<th>Função</th>
</thead>
<tbody>
<?php
set_time_limit(60);
$file 'nome-do-arquivo.txt';
$ptnPUB '/[0-9]{3}\/[0-9]{4}/'/* --- Resultado: 000/0000 --- */
$ptnDT '/(([de]{2})\s)([0-9]{2})\/([0-9]{2})\/([0-9]{4})/';/* --- Resultado: "de 00/00/0000" --- */
$ptnNome '/(([Ddesignar]){8}\s((([A-ZÀ-Ü]){2,})(\s)?()){5,})/';/* --- Resultado: "Chamar NOME SOBRENOME" ou "chamar NOME SOBRENOME" --- */
$ptnFuncao '/(([para]{4}\s).*[.])/';/* --- Resultado: "para (...)" fim em ponto final --- */
$handle fopen($file,'r');
if ($file == false) die('O arquivo não existe');
if ($handle) {
while (!feof($handle)) {
$content fgets($handle);
preg_match($ptnPUB$content$resultsPUB);
preg_match($ptnDT$content$resultsDT);
preg_match($ptnNome$content$resultsNome);
preg_match($ptnFuncao$content$resultsFuncao);
echo ("<tr>");
echo ("<td>");
print($resultsPUB[0]);
echo ("</td>");
echo ("<td>");
print($resultsDT[0]);
echo ("</td>");
echo ("<td>");
print($resultsNome[0]);
echo ("</td>");
echo ("<td>");
print($resultsFuncao[0]);
echo ("</td>");
echo ("</tr>");
}
}
fclose($handle);
?>

</tbody>
</table>