从哪里开始诊断问题?
我什至不知道从哪里开始看。我正在练习字符串和文件整理,但无法sed '$d' file.sh
删除文件的最后一行;此外,我尝试使用 sudo (这也不起作用)。
我的消息来源说我的命令应该有效。
我知道你可以使用诸如cat
、tail
、 和 之类的东西head -n -1
来打印,而且我还读到我应该能够使用这些来删除,但我发现的唯一可靠的来源是关于从字面上删除行的:https://linuxhint.com/sed-command-to-delete-a-line/它说使用上面显示的命令:它不起作用。
最佳的揣测?
我注意到该命令成功-i
删除了文件的最后一行。为什么 -i 有效而缺少 -i 则无效?当我不包含 -i 时,幕后会发生什么,它会损坏我的硬盘吗?
答案1
sed
(70年代的命令)是一个s
tream ed
itor,它并不意味着编辑文件。有关文件文本编辑器,请参阅ed
、 、ex
。vi
sed
在标准输入或文件内容(如果某些内容作为参数传递)上获取输入流,对与地址匹配的每一行应用脚本中的命令来动态处理它们,sed
并在标准输出上打印过滤结果。
因此,打印除最后一行 ( )sed '$d'
之外的所有输入,该行被卡片/删除。$
d
d
> newfile
您可以通过添加或通过管道将其传递到另一个命令(例如| tr -s '[:blank:]' ' '
挤压空格)来将该输出保存到文件中。
perl
(从 80 年代中期开始)有一个-p
选项可以使其像sed
.perl
还添加了一个-i[.back]
(对于i
n-place)选项来更改行为,以便将结果写入文件的新副本,而不是将结果写入标准输出,并可选择保留带有后缀的原始副本.back
。
GNU 和 FreeBSD 实现都sed
在 2000 年代初添加了类似的功能,但在不需要备份时使用不同的语法:sed -i '$d' file
GNU 和sed -i '' '$d' file
FreeBSD。 sed -i.back '$d'
两者都适用,sed -i .back '$d'
但仅适用于 FreeBSD。
其他几个sed
实现添加了一个-i
选项,因为其中大多数是 GNU 方式,但不是全部,并且在任何情况下,这都不是标准选项。
sed
不是唯一的流编辑器应用程序。cat
, awk
, paste
, tr
, nroff
, eq
, sort
, join
, cut
... 以相同的方式工作并获取输入并产生输出。这个想法是将它们连接在一起来完成某些任务,这是 Unix shell 脚本的优势之一。其中很少有人可以就地编辑文件。awk
aka的 GNU 实现gawk
有一个-i in-place
选项。sort
可以调用sort -o file file
(它可以,因为它需要在开始写入输出之前读取整个输入,在这种情况下没有备份)。