2

我有以下很长的文件:

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

stop

我想在最后一个之前插入多close unit 1stop。该文件包含未定义数量的close unit 1.

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

4

3 回答 3

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

于 2013-07-25T11:44:39.540 回答
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中使用它:sed

nl -ba long-file \
    | grep -F 'close unit 1' \
    | tail -n1 \
    | ( read line junk
        sed -e $line's/^/\n\n/' long-file > new-file
      )
于 2013-07-25T11:35:56.507 回答
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 1close unit 1在保持空间中存储以开头的行集合,并在存储下一个之前打印上一个集合。在文件末尾,最后一个集合仍将在保留空间中,因此插入所需的行,然后打印最后一个集合。

于 2018-08-02T14:14:19.210 回答