在包含指定单词的最后一次出现的行之后插入一行文本

在包含指定单词的最后一次出现的行之后插入一行文本

基本上,我想在包含特定字符串最后一次出现的行之后插入一行文本,而不影响文件的其余部分。

我想我应该这样做:

  1. 删除指定单词最后一次出现后的所有行
  2. 将所需字符串附加到文件底部
  3. 将之前删除的部分附加到新插入的行之后

在我的例子中,在包含特定单词的最后一次出现的行之后,没有其他文本:只有一定数量的空行和#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)。

相关内容