如何在 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

使-0slurpperl整個文件,並-p告訴它在應用 給出的腳本後列印每個輸入行-e。腳本本身會匹配 58F和周圍的兩行並將其刪除。

答案3

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

它會進行sed單行前瞻,然後只P輸出不適合您的系列的任何行,因為當它與前兩行匹配時,它會再跳轉一次並轉儲緩衝區。

相關內容