Como combinar um padrão, excluir o padrão e também a próxima e a linha anterior no Solaris 10

Como combinar um padrão, excluir o padrão e também a próxima e a linha anterior no Solaris 10

Como posso combinar um padrão, excluir o padrão e também a linha seguinte e anterior no Solaris 10? Estou batendo na 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, emiti o seguinte:

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

E a linha que corresponde e a linha anterior?

Talvez isso possa ser conseguido usando ed ou vi? THX!

Responder1

Aqui está um edroteiro:

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

Ele grava a saída no arquivo newfile.txt.


A versão "global" repetida disso é

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

Responder2

Uma perlabordagem (assumindo que seu arquivo seja pequeno o suficiente para ser carregado na memória):

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

O -0faz perlsorver o arquivo inteiro e -pdiz para imprimir cada linha de entrada após aplicar o script fornecido por -e. O próprio script corresponde a 58 Fse as duas linhas adjacentes e as remove.

Responder3

sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out

Isso obtém seduma visão antecipada de uma linha e, em seguida, apenas Pproduz a saída de quaisquer linhas que não se ajustem à sua série, porque salta mais uma e despeja o buffer quando corresponde às duas primeiras linhas dela.

informação relacionada