为什么 `sed '$d' file` 不删除最后一行?

为什么 `sed '$d' file` 不删除最后一行?

从哪里开始诊断问题?

我什至不知道从哪里开始看。我正在练习字符串和文件整理,但无法sed '$d' file.sh删除文件的最后一行;此外,我尝试使用 sudo (这也不起作用)。

我的消息来源说我的命令应该有效。

我知道你可以使用诸如cattail、 和 之类的东西head -n -1来打印,而且我还读到我应该能够使用这些来删除,但我发现的唯一可靠的来源是关于从字面上删除行的:https://linuxhint.com/sed-command-to-delete-a-line/它说使用上面显示的命令:它不起作用

最佳的揣测?

我注意到该命令成功-i删除了文件的最后一行。为什么 -i 有效而缺少 -i 则无效?当我不包含 -i 时,幕后会发生什么,它会损坏我的硬盘吗?

答案1

sed(70年代的命令)是一个stream editor,它并不意味着编辑文件。有关文件文本编辑器,请参阅ed、 、exvi

sed在标准输入或文件内容(如果某些内容作为参数传递)上获取输入流,对与地址匹配的每一行应用脚本中的命令来动态处理它们,sed并在标准输出上打印过滤结果。

因此,打印除最后一行 ( )sed '$d'之外的所有输入,该行被卡片/删除。$dd

> newfile您可以通过添加或通过管道将其传递到另一个命令(例如| tr -s '[:blank:]' ' '挤压空格)来将该输出保存到文件中。

perl(从 80 年代中期开始)有一个-p选项可以使其像sed.perl还添加了一个-i[.back](对于in-place)选项来更改行为,以便将结果写入文件的新副本,而不是将结果写入标准输出,并可选择保留带有后缀的原始副本.back

GNU 和 FreeBSD 实现都sed在 2000 年代初添加了类似的功能,但在不需要备份时使用不同的语法:sed -i '$d' fileGNU 和sed -i '' '$d' fileFreeBSD。 sed -i.back '$d'两者都适用,sed -i .back '$d'但仅适用于 FreeBSD。

其他几个sed实现添加了一个-i选项,因为其中大多数是 GNU 方式,但不是全部,并且在任何情况下,这都不是标准选项。

sed不是唯一的流编辑器应用程序。cat, awk, paste, tr, nroff, eq, sort, join, cut... 以相同的方式工作并获取输入并产生输出。这个想法是将它们连接在一起来完成某些任务,这是 Unix shell 脚本的优势之一。其中很少有人可以就地编辑文件。awkaka的 GNU 实现gawk有一个-i in-place选项。sort可以调用sort -o file file(它可以,因为它需要在开始写入输出之前读取整个输入,在这种情况下没有备份)。

相关内容