这个 sed 对脚本“$a\”做了什么?

这个 sed 对脚本“$a\”做了什么?

我遇到了这个 sed 命令,但我不知道它在做什么。我知道它正在使用 就地更改文件-i,它正在使用脚本-e并且脚本是$a\,但是这个脚本在做什么?

sed -i -e '$a\' filename

答案1

正如其他人所说,例如如何在文件末尾添加换行符?,对于 GNU sed(以及其他一些实现),$a\如果文件没有换行符,则在文件末尾添加换行符。

为什么它的作用不是很清楚,文档也没有解释。然而,检查源代码确实......

让我们从文档开始。$a\是 的变体a,利用 的特殊情况GNU 扩展

作为 GNU 扩展,a命令和文本可以分为两个-e参数,以便更轻松地编写脚本:

$ seq 3 | sed -e '2a\' -e hello
1
2
hello
3

$ sed -e '2a\' -e "$VAR"

a该方法的实现方式sed是使用要附加的文本队列,并在append_queue.当需要处理这个队列时,一个名为dump_append_queue,第一步是

output_missing_newline (&output_file);

如果需要的话,它会添加一个缺失的换行符——以确保附加的文本将要添加到单独的行中,而不是添加到当前行的末尾。然后追加队列的内容。

使用 时sed -i '$a\',如有必要,会添加缺少的换行符,然后处理队列 - 但队列为空,因此不会进行任何其他更改。

答案2

如果最后一行不存在,则会在最后一行添加一个换行符:

创建一个没有尾随换行符的文件

$ printf 'line1\nline2' > file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2
0000013

让我们看看 sed 做了什么:

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

如果我们再次运行它会发生什么?是否添加其他新队?

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

没有。

相关内容