Как сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10

Как сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10

Как мне сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10? Я в тупике, потому что Solaris не поставляется с GNU sed. Дано следующее содержимое файла:

    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)

Я хотел бы удалить блок, содержащий:

    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }

Файл будет выглядеть так:

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)

Чтобы удалить следующую строку, я выполнил следующее:

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

А как насчет строки, которая совпадает с предыдущей строкой?

Может быть, этого можно добиться с помощью ed или vi? Спасибо!

решение1

Вот edсценарий:

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

Он записывает вывод в файл newfile.txt.


«Глобальная» повторяющаяся версия этого —

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

решение2

Подход perl(предполагается, что ваш файл достаточно мал для загрузки в память):

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

Заставляет -0slurp perlвесь файл, а -pсообщает ему, что нужно выводить каждую входную строку после применения скрипта, заданного -e. Сам скрипт сопоставляет 58 Fs и окружающие их две строки и удаляет их.

решение3

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

Это обеспечивает sedпросмотр на одну строку вперед, а затем Pвыводит только те строки, которые не соответствуют вашей серии, поскольку он переходит еще на одну строку и сбрасывает буфер, когда совпадает с первыми двумя строками.

Связанный контент