用于删除 Mac 上文件第一行的 Unix 脚本

Unix script to delete the first line of a file on a Mac

在我的 Mac 上,当我尝试 运行 时:

sed -i 2d file.csv

根据对 Unix script to remove the first line of a CSV file 的回答,我得到以下错误:

sed: 1: "file.csv": invalid command code f

如果我想删除file.csv的前两行怎么办?

sed -i.bak '2,3d' filename.csv 将删除第 1 行和第 2 行(假设您有 headers)

此命令的作用是编辑被引用的文件,同时创建原始文件的备份(因此使用 .bak)。删除行'2,3d'会删除原文件的第2、3行

在 Mac 上,BSD sed 需要备份后缀(但后缀可以是空字符串,'')——它不是可选的使用 GNU sed。因此,您的命令被解释为“备份后缀为 2d 的文件……糟糕,您提供的脚本是 file.csv,但 f 不是 sed命令。

sed -i .bak -e 2d file.csv

这将从 CSV 文件中删除第一行数据(保留标题行)。

如果您希望编写的代码同时适用于 BSD 和 GNU sed,那么您必须将后缀附加到 -i 选项(GNU sed 需要附加到 -i 选项的后缀;这就是它识别是否有可选后缀的方式:

sed -i.bak -e 2d file.csv

请注意,您不能使用空后缀并使命令同时适用于 BSD sed 和 GNU sed

-e 在这两个命令行中都不是必需的,但我经常使用它。我也经常用单引号引用命令,虽然这里没有必要。

如果要删除前两行数据,使用2,3d作为命令。如果要删除前两行,请使用 1,2d.

如果您不需要备份,那么您可以在 sed 命令完成后将其删除(最简单),或者使用两阶段或三阶段舞蹈:

sed 2d file.csv > file.csv.bak &&
mv file.csv.bak file.csv            # Oops; there went the links

sed 2d file.csv > file.csv.bak &&
cp file.csv.bak file.csv
rm -f file.csv.bak

有了这些,如果中断或其他信号终止了脚本,您可能需要添加 trap 命令来清理中间 .bak 文件。


引用 sed 的 Apple 文档——最初由 Diego in an answer 引用,他选择删除,-i 选项采用一个参数,指示要使用的扩展用于备份副本。

-i extension

Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.