我遇到了这个 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
没有。