Separar partes de String em Bash por Regex

Iniciado por euconectei, 10 de Outubro de 2013, 12:12

tópico anterior - próximo tópico

euconectei

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.

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:

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

irtigor

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.

euconectei

Citação de: irtigor 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.

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!

euconectei

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!

Arthur Bernardes


euconectei

Opa!

Tá aí:


<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>