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

Gau*_*tam 7 sed awk text-processing ed

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

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

结果应该是

1
2
3
New line
4
5
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

使用ed

$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5
Run Code Online (Sandbox Code Playgroud)

ed编辑脚本:

$-1i
New line
.
,p
Run Code Online (Sandbox Code Playgroud)

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

您可以将其重定向到一个新文件,或者您可以使用

printf '$-1i\nNew line\n.\nw\n' | ed -s file
Run Code Online (Sandbox Code Playgroud)

,p更改为w)。

后者也是您类似地ex用于此工作的方式:

printf '$-1i\nNew line\n.\nw\n' | ex -s file
Run Code Online (Sandbox Code Playgroud)

ed并且ex是标准的面向行的编辑器(与全屏编辑器相反),应该随您的系统一起提供。请注意,这-s对每个人意味着不同的事情,但在执行此类批处理模式编辑任务时适用于两者。

  • ed. “外壳和实用程序”。 基本规格。IEEE 1003.1:2017。开放组。
  • ex. “外壳和实用程序”。 基本规格。IEEE 1003.1:2017。开放组。

进一步阅读:

  • Dale Dougherty 和 Tim O'Reilly (1987)。“高级编辑”。Unix 文本处理。海登书。


dgf*_*xcv 6

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

$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file
Run Code Online (Sandbox Code Playgroud)

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

$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file
Run Code Online (Sandbox Code Playgroud)

或单线

$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
Run Code Online (Sandbox Code Playgroud)

  • 这将耗尽输入文件中的所有尾随空白行。 (2认同)

αғs*_*нιη 5

sed你也可以使用 GNU :

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

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

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

3*\n
4\n
5\n*
Run Code Online (Sandbox Code Playgroud)

可移植性,你会使用:

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

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

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

怎么运行的

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