我遇到了这个 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让\xe2\x80\x99s 从文档开始。$a\\
是 的变体,利用GNU 扩展a
的特殊情况:
\n\n作为GNU扩展,
\na
命令和文本可以分为两部分-e
参数,从而更容易编写脚本:Run Code Online (Sandbox Code Playgroud)\n$ seq 3 | sed -e \'2a\\\' -e hello\n1\n2\nhello\n3\n\n$ sed -e \'2a\\\' -e "$VAR"\n
该方法a
的实现方式sed
是使用要附加的文本队列,并在append_queue
. 当需要处理这个队列时,在一个名为 的函数dump_append_queue
中,第一步是
$ 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 但队列为空,因此不进行任何其他更改。
如果最后一行不存在,则会在最后一行添加一个换行符:
创建一个没有尾随换行符的文件
$ 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)
没有。