sed在多行模式之前插入多行

时间:2013-07-25 11:21:23

标签: sed pattern-matching

我有以下很长的文件:

...
close unit 1
...
...
close unit 1
...
...
close unit 1

stop

我想在close unit 1之前的stop之前插入多个行。该文件包含未定义的close unit 1

我在这里和那里发现了很多其他类似的问题,但答案对我没有帮助......例如我试过https://stackoverflow.com/a/8635732/1689664但是这没有用......

3 个答案:

答案 0 :(得分:2)

使用sedtac

$ tac inputfile | sed '/close unit 1/ {s/\(.*\)/\1\nLine3\nLine2\nLine1/; :loop; n; b loop}' | tac
...
close unit 1
...
...
close unit 1
...
...
Line1
Line2
Line3
close unit 1

stop

请注意,您需要在sed表达式中以相反的顺序指定输入

答案 1 :(得分:1)

Perl解决方案:

perl -ne '  push @arr, $_;
            print shift @arr if @arr > 3;
            if ("stop\n" eq $_ and "close unit 1\n" eq $arr[0]) {
                print "\n\n";                                     # Inserted lines
            }
         }{ print @arr ' long-file > new-file

它保留最后3行的滑动窗口,如果窗口中的最后一行是stop而第一行是close unit 1,它会打印这些行。

另一种可能性是使用nl对行进行编号,然后使用grep行包含close unit 1,获取最后一行的编号并在{{1}中使用它地址:

sed

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed '/close unit 1/,$!b;/close unit 1/{x;/./p;x;h;d};H;$!d;x;i\line 1\nline 2\n...' file

按常规在第一次出现close unit 1之前打印每一行。在存放空间中存储以close unit 1开头的行的集合,并在存储下一个集合之前打印上一个集合。在文件末尾,最后一个集合仍将保留在保留空间中,因此请插入所需的行,然后打印最后一个集合。