在最后一行之前插入文本 N 行

在最后一行之前插入文本 N 行

我想在最后一行之前的两行中插入一个新行。所以如果我的原始文件是:

1
2
3
4
5

结果应该是

1
2
3
New line
4
5

答案1

使用ed

$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5

编辑ed脚本:

$-1i
New line
.
,p

首先移动到从末尾 ( $-1) 向上一行的行,并i在该行上方插入 ( ) 新内容。插入的内容以单点结束(允许多行)。最后一个,p在终端上显示完整修改的缓冲区。

您可以将其重定向到一个新文件,也可以使用以下命令将其写回原始文件

printf '$-1i\nNew line\n.\nw\n' | ed -s file

,p改为w)。

后者也是您ex在这项工作中类似使用的方式:

printf '$-1i\nNew line\n.\nw\n' | ex -s file

edex是标准的面向行的编辑器(而不是全屏编辑器),应该随您的系统一起提供。请注意,这-s对每个人来说意味着不同的事情,但在执行这样的批处理模式编辑任务时对两者都适用。

  • ed。 “壳牌和公用事业”。 基本规格。 IEEE 1003.1:2017。开放组。
  • ex。 “壳牌和公用事业”。 基本规格。 IEEE 1003.1:2017。开放组。

进一步阅读:

  • 戴尔·多尔蒂和蒂姆·奥莱利 (1987)。 “高级编辑”。Unix 文本处理。海登图书。

答案2

head它可以通过简单的和来完成tail

$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file

正如评论中提到的,它会吃掉任何尾随的空白行。因此,为了保留尾随空白行,

$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file

或单线

$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file

答案3

sed你也可以使用 GNU :

sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile

在文件的倒数第三行插入一行New-line(在最后一行之前插入一行)。

这与 ewline 后跟除 ewline 以外的任何内容(\n[^\n]*){3}$相匹配,并且从文件末尾开始最多 3 次,其中选项大小写\n\n-zsed将文件作为单行读取(用 NUL 字符分隔行)。所以它只会在下面匹配(在我突出显示的星号之间):

3*\n
4\n
5\n*

可移植性,你会使用:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile

如果您仍然sed无法处理\n替换部分中的换行符,您可以使用实际的换行符或按Ctrl+V后跟Enter将打印^M回车键的控制字符:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile

怎么运行的

追加N每一行sed读取模式空间,然后添加新行,直到读取所有行。定义:t标签并$!bt说明sed跳转到调用的标签,t只要它不是文件末尾。

答案4

这个对于插入行的内容应该非常稳健,但需要扫描文件两次(wc对于第一遍)。

sed "$(($(wc -l < yourfile)-$N))a"'new line' yourfile

相关内容