我想在最后一行之前的两行中插入一个新行。所以如果我的原始文件是:
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
ed
和ex
是标准的面向行的编辑器(而不是全屏编辑器),应该随您的系统一起提供。请注意,这-s
对每个人来说意味着不同的事情,但在执行这样的批处理模式编辑任务时对两者都适用。
进一步阅读:
- 戴尔·多尔蒂和蒂姆·奥莱利 (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
-z
sed将文件作为单行读取(用 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