基本上,我想在包含特定字符串最后一次出现的行之后插入一行文本,而不影响文件的其余部分。
我想我应该这样做:
- 删除指定单词最后一次出现后的所有行
- 将所需字符串附加到文件底部
- 将之前删除的部分附加到新插入的行之后
在我的例子中,在包含特定单词的最后一次出现的行之后,没有其他文本:只有一定数量的空行和#EOF
最后一行上的特殊字符串。重要的是保留此部分,并保留完全相同数量的空行,并且标签#EOF
完好无损。
这是一个示例输入文件:
First line
Second line
Third line 1
Third line 2
Third line N
#EOF
为了便于说明,我想Fourth line
在包含单词 的最新出现的行之后附加一行文本Third
。结果应如下所示:
First line
Second line
Third line 1
Third line 2
Third line N
Fourth line
#EOF
您可以看到后面的换行符数量Fourth line
与之前保持不变。
在这种情况下哪个命令是最好的?我尝试了以下操作,但文件中的所有行都被删除了,只有Fourth line
附加了内容。
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file
echo -e "\nFourth line\n\n\n#EOF" >> file
我对 shell 脚本还很陌生,因此非常感谢任何帮助。
答案1
问题:
据我了解,您要求在出现某个单词的最后一行后插入一行。文件中接下来的内容并不重要,只要保留即可。假设单词是,要Third
插入的行是Fourth line
。Perl 可以在这种情况下提供帮助:
perl -0777 -pe 's/(.*Third[^\n]*)/$1\nFourth line/s' input.txt
答案2
您可以简单地在特定位置插入行,如下所示:
sed '4iFourth Line' file
或者,perl
如果您不知道需要插入哪一行,请使用的多行匹配功能。
perl -0777 -pe 's/(\n{2,}#EOF)/\nFourth Line$1/g' file
解释:
-0777
- 读取整个文件(读作一行)(\n{2,}#EOF)
- 匹配并捕获 2+ 连续\n
后跟 #EOF\nFourth Line$1
- 用 替换匹配,\nFourth Line
然后跟上模式匹配 ($1
)。