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

Oli*_*ton 7 sed

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

sed -i -e '$a\' filename
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 14

正如其他人所说,例如如何在文件末尾添加换行符?,使用 GNU sed(和其他一些实现),$a\\如果文件没有\xe2\x80\x99t 有换行符,则在文件末尾添加换行符。

\n

为什么这样做并不是那么清楚,并且文档也没有解释它。然而,检查源代码确实......

\n

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

\n
\n

作为GNU扩展,a命令和文本可以分为两部分-e参数,从而更容易编写脚本:

\n
$ seq 3 | sed -e \'2a\\\' -e hello\n1\n2\nhello\n3\n\n$ sed -e \'2a\\\' -e "$VAR"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
$ seq 3 | sed -e \'2a\\\' -e hello\n1\n2\nhello\n3\n\n$ sed -e \'2a\\\' -e "$VAR"\n
Run Code Online (Sandbox Code Playgroud)\n

如果需要,它将添加缺少的换行符 \xe2\x80\x94 以确保附加文本添加到单独的行,而不是添加到当前行的末尾。然后追加队列的内容。

\n

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

\n


gle*_*man 5

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

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

$ printf 'line1\nline2' > file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2
0000013
Run Code Online (Sandbox Code Playgroud)

让我们看看 sed 做了什么:

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014
Run Code Online (Sandbox Code Playgroud)

如果我们再次运行它会发生什么?它会添加另一个换行符吗?

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014
Run Code Online (Sandbox Code Playgroud)

没有。