我有以下很长的文件:
...
close unit 1
...
...
close unit 1
...
...
close unit 1
stop
我想在close unit 1
之前的stop
之前插入多个行。该文件包含未定义的close unit 1
。
我在这里和那里发现了很多其他类似的问题,但答案对我没有帮助......例如我试过https://stackoverflow.com/a/8635732/1689664但是这没有用......
答案 0 :(得分:2)
使用sed
和tac
:
$ 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
开头的行的集合,并在存储下一个集合之前打印上一个集合。在文件末尾,最后一个集合仍将保留在保留空间中,因此请插入所需的行,然后打印最后一个集合。