答案1
第一个命令创建一个包含七行文本的文件。该数据用于所以答案为了说明该命令的效果sed
,它被写入一个名为file
.
$'...'
给定一个能够理解(“C 字符串”)并且您使用 GNU sed
(理解d}
为)的 shell d;}
,第二个命令将在标准输出上返回测试数据文件的最后一行,并将其从文件中删除,从而备份原始数据(file~
备份原始数据就是file~
这样-i~
做的)。
在SO答案中,sed
编辑脚本在命令行上编写为
\$$'{w/dev/stdout\n;d}'
这是一个文字$
,后跟一个“C 字符串”,$'{w/dev/stdout\n;d}'
。 C 字符串引用意味着\n
将扩展为文字换行符,这给出了
${w/dev/stdout
;d}
...这是一种草率的脚本编写sed
方式
$ {
w /dev/stdout
d
}
此sed
编辑脚本将除最后一行之外的所有内容原封不动地传递到输出(file
由于-i
使用了该选项,该脚本将进入文件)。
最后一行使用该命令写入/dev/stdout
而不是写入默认输出(在本例中) ,然后使用 删除。file
w
d
效果是,除了最后一行之外的所有行都保留在(写回),file
而最后一行在标准输出上生成(将连接到您的终端)。
答案2
您对您提出的问题得到了很好的回答,但仅供参考,“如何使用 sed 对文件实施命令”的最佳答案pop
是“不要这样做”。我希望这个问题如果没有因为不清楚而迅速结束的话,将会得到答案。
以下使用 GNU awk 而不是您当前使用的 GNU sed,将在任何 shell 中工作,并且希望更容易理解:
$ awk -i inplace 'NR>1{print prev} {prev=$0} END{if (NR) print prev}' file
Line # 7
$ cat file
Line # 1
Line # 2
Line # 3
Line # 4
Line # 5
Line # 6
看https://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-Inplace有关使用 GNU awk 进行“就地”编辑的更多信息。