如何在 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输出不适合您的系列的任何行,因为当它与前两行匹配时,它会再跳转一次并转储缓冲区。

相关内容