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