[RESOLVIDO]Ajuda com egrep + Runtime + Process[/RESOLVIDO]

6 respostas
jotinhaelloco

Pessoal, estou escrevendo um metodo para poder limpar comentários de arquivos de texto (linhas iniciadas com #)…
Mas quando executo o método abaixo, nada acontece (nem se cria o novo arquivo sem comentários, nem mostra-se erros na saida do programa)…
Quando executo o comando no terminal (egrep -v "^#|^$" /home/jotinhaelloco/teste.conf > /home/jotinhaelloco/teste2.conf - as contra-barras são caracteres de escape), ele funciona normal e gera o arquivo descomentado…
Alguem tem alguma sugestão?

public static void limparComentarios() { try { Runtime r = Runtime.getRuntime(); Process p; p = r.exec("egrep -v \"^#|^$\" /home/jotinhaelloco/teste.conf > /home/jotinhaelloco/teste2.conf"); p.waitFor(); } catch (IOException ex) { ex.printStackTrace(); } catch (InterruptedException exx) { exx.printStackTrace(); } }

6 Respostas

ricardo.ludwig

Eu acredito que o problema pode ser os caracteres de escape, talvez seria interessante você fazer um shell e o seu código Java chamá-la.
Abcs!

jotinhaelloco

O problema foi que o redirecionador ( > ) é coisa do shell, e o Java não implementa... entao eu pensei em executar uma coisa de cada vez... Dai fiz:

try {
            Runtime r = Runtime.getRuntime();
            Process p;
            p = r.exec("egrep -v \"^#|^$\" /home/jotinhaelloco/teste.conf");
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((linha = input.readLine()) != null) {
                System.out.println(linha);
            }
            input.close();
        } catch (IOException ex) {
            ex.printStackTrace();

        }

para poder capturar a saida do comando...

mas ao invez de capturar a saida que seria:

not coment
not coment
not coment
not coment
not coment
not coment
not coment
not coment
not coment
not coment

ele mostra:

#coment
not coment
#coment
#coment
#coment
#coment
not coment
#coment
not coment
#coment
#coment
#coment
#coment
not coment
#coment
not coment
#coment
#coment
#coment
#coment
not coment
#coment
not coment
#coment
#coment
#coment
#coment
not coment
#coment
not coment
#coment
#coment
#coment
#coment
not coment

alguem teria alguma solução?

ricardo.ludwig

Você tem razão sobre o redirecionador da Shell o Java monta a string certa mas na hora da execução dá algum erro que não descobri ainda, por isso ainda acho válida minha sugestão de fazer seu código Java chamar uma Shell para executar esse comando.
A saída que vc está pegando nesse segundo código acredito que seja apenas a leitura do arquivo e não a saída do comando.
O código que anexo você pode verificar as saídas de erro da Shell. A linha comentada é uma shell que chamo para execução do comando, funciona perfeitamente.
PS. O seu comando para grep no meu Bash estava errado, eu alterei isso tb, eu uso Debian Lenny.
Abcs!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestGrep {

	public TestGrep() {
		super();
	}

	public static void main(String[] args) {

		String s = null;
		long erro = 0;
		try {
			Runtime r = Runtime.getRuntime();
			Process p;
			//p = r.exec("sh /home/lud/job_grep.sh");
			p = r.exec("egrep -v '^#|^$' /home/lud/teste.conf > /home/lud/saida.conf");
			p.waitFor();

			BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
			erro= p.exitValue();
			if(erro != 0) {
				System.out.println("Erro na execucao do comando no shell:");
				while ((s = stdError.readLine()) != null) {
					System.out.println(s);
				}	
				System.out.println("Saida da Execucao = 0 Sucesso != 0 Erro. Saida: " +erro);	
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		} catch (InterruptedException exx) {
			exx.printStackTrace();
		}
	}
}
jotinhaelloco

Opa cara, valew mesmo! Vô tentar isso! Mas eu estava querendo uma solução que não fosse precisar de nada externo…
Vou ver aki, se algo der certo, compartilho! Abraços!

jotinhaelloco

Valeu mesmo pela força ricardo.ludwig, mas acabei implementando uma solução baseada só em Java mesmo, sem usar comando externo!

Compartilho com vcs o código:

public static void limparComentarios(String caminho) {
        String linha = "";
        String texto = "";
        try {
            FileReader reader = new FileReader(caminho);
            BufferedReader leitor = new BufferedReader(reader);
            while ((linha = leitor.readLine()) != null) {
                if (linha.trim().startsWith("#") || linha.trim().equalsIgnoreCase("")) {
                    leitor.readLine();
                }else {
                    texto = texto + linha + "\n";
                }
            }
            leitor.close();
            reader.close();
            FileWriter writer = new FileWriter(caminho);
            PrintWriter saida = new PrintWriter(writer);
            saida.println(texto.trim());
            saida.close();
            writer.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

PS.: Vale lembrar que este código limpa as linhas comentadas com # e as que estão totalmente em branco!

ricardo.ludwig

É a melhor solução, assim não fica amarrado ao S.O.

Abcs!

Criado 29 de abril de 2010
Ultima resposta 1 de mai. de 2010
Respostas 6
Participantes 2