Regex para sed para pegar várias linhas ou uma maneira melhor?

5

Estou criando um script que se conecta a um servidor e faz o dump da saída para um arquivo temporário. Eu quero usar sed no script para pegar informações específicas do arquivo temporário. A saída sempre teria a linha tracejada de 80 caracteres, em seguida, as informações desejadas seguidas pela instrução Desconectada.

Eu consegui um regex funcionando se fosse apenas uma única linha, o problema é como eu agrupo as novas linhas também?

Regex

-\{80\}[\r\n]*\(.*\)[\r\n]\{4\}Disconnected

Arquivo

...
--------------------------------------------------------------------------------
The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.

Disconnected ...

Saída desejada

The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.
    
por LF4 24.09.2011 / 19:06

3 respostas

5

Primeiro, use o sinalizador '-n' para suprimir a saída automática. Em seguida, use sed endereços para citar a parte em que você está interessado (dos traços "---" até uma linha que tenha a palavra "Desconectado"). Finalmente, imprima o espaço padrão (todo o espaço do padrão, já que você está interessado em tudo dentro dele).

~$ sed -n '/^---*/,/Disconnected/{p}' inputfile

Editado por causa da solicitação do LF4 de remover a linha com traços do resultado.

Com os "endereços" você cita espaços de padrão individuais. Então você pode fazer o que quiser com esses espaços de padrão individuais. Incluindo remover linhas por regexp. No exemplo, o comando remove as linhas formadas por traços do espaço padrão, gerando a saída que você está procurando:

~$ sed -n '/^---*/,/Disconnected/{/^---*/d;p}' inputfile

HTH

    
por 24.09.2011 / 20:01
4

sed pode procurar o padrão em várias linhas, concatenando-as no que é chamado de "espaço reservado", algo assim:

$ sed -n '1h;1!H;${;g;s/.*\(-\{80\}.*Disconnected\).*//p;}' file
  • 1h : copie a primeira linha para manter espaço
  • 1!H : da segunda linha, anexe para manter espaço
  • $ : a última linha
  • g : copie o espaço de espera para o buffer padrão
  • s/pattern/substitution/ : pesquisar e substituir
  • : referência anterior ao grupo no padrão
  • p : print
por 24.09.2011 / 20:01
1

A maneira mais fácil, mas não muito eficiente, é

  1. Use tr para remover todas as novas linhas.

    tr '\n' ' '
    
  2. Adicione novamente as novas linhas após o comando Disconnected with sed's \a .

  3. Analise esses dados usando seu comando sed .
por 24.09.2011 / 19:36

Tags