Filtrando dados com sed

0

Eu preciso de ajuda. Eu tenho um arquivo como

sometext line 1
sometext line 2
SU0000 
ID
ID
ID
sometext line 3
sometext line 4
sometext line 5
sometext line 6
SU0000 
ID
ID
ID
sometext line 7
sometext line 8

Eu quero filtrar o texto de forma que a saída seja

sometext line 2
SU0000 
ID
ID
ID
sometext line 6
SU0000 
ID
ID
ID

Em outras palavras, quero obter a linha antes do padrão e todas as linhas depois de começar com o ID.

Eu quero fazer isso em sed. Alguém pode ajudar por favor.

    
por vinay 17.05.2014 / 15:28

1 resposta

3

Você não pode. Não é o que sed foi projetado para fazer.

Você pode fazer isso com grep , se o número de ocorrências de ID for corrigido. Se, em vez disso, for variável, você precisará de algo mais poderoso, como um script bash ou perl.

Se o número de ocorrências de ID for fixo (digamos, 3), então o seguinte comando

  grep -B 1 -A 3 SU0000 filename.txt

fará o que você precisa.

EDITAR:

se o número de ocorrências de SU0000 não for fixo, o script a seguir fará o truque para você, onde o arquivo a ser analisado é chamado de "dados". Mude-o da maneira que melhor lhe convier.

  #!/bin/bash

  I_INSIDE=0
  PREVIOUS_LINE=""

  while read line; do
    echo $line | grep -e SU0000 2>&1 1>/dev/null
    if [ $? == 0 ]; then
            echo $PREVIOUS_LINE
            echo $line
            I_INSIDE=1
            PREVIOUS_LINE=$line
            continue
    fi
    echo $line | grep -e ID 2>&1 1>/dev/null
    if [ $? == 0 -a $I_INSIDE == 1 ]; then
            echo $line
    else
            I_INSIDE=0
    fi
    PREVIOUS_LINE=$line

  done < data

É um roteiro muito elementar, para permitir que você siga todas as instruções. poderia ter sido condensado consideravelmente.

    
por 18.05.2014 / 10:57

Tags