Como corresponder a um padrão, exclua o padrão e também a linha seguinte e a anterior no Solaris 10

4

Como posso combinar um padrão, excluir o padrão e também a linha seguinte e a anterior no Solaris 10? Estou atacando a parede porque o Solaris não vem com o GNU sed. Dado o seguinte conteúdo do arquivo:

    LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Gostaria de remover o bloco que contém:

    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }

O arquivo seria:

LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Para excluir a próxima linha, enviei o seguinte:

sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt

E a linha que combina com a linha anterior?

Talvez isso possa ser feito usando ed ou vi? Thx!

    
por Jonathan 04.11.2015 / 15:44

3 respostas

3

Uma abordagem perl (supondo que seu arquivo é pequeno o suficiente para carregar na memória):

perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file

O -0 faz com que perl absorva o arquivo inteiro, e o -p diz para imprimir cada linha de entrada depois de aplicar o script fornecido por -e . O próprio script corresponde a 58 F s e as duas linhas ao redor e as remove.

    
por 04.11.2015 / 16:59
5

Veja um script ed :

ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!

Grava a saída no arquivo newfile.txt .

A versão repetida "global" disso é

ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!
    
por 04.11.2015 / 16:18
3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out

Isso obtém sed uma consulta antecipada de uma linha e, em seguida, apenas P rints para gerar as linhas que não se ajustam à sua série, porque ele salta mais uma vez e despeja o buffer quando coincide com as duas primeiras. linhas dele.

    
por 04.11.2015 / 16:43