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

时间:2015-04-07 02:39:50

标签: macos unix sed

在我的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的前两行?

,我该怎么办?

2 个答案:

答案 0 :(得分:12)

在Mac上,BSD sed需要备份后缀(但后缀可以是空字符串'') - 它不是可选的,因为它与GNU {{1}一样}。因此,您的命令被解释为"使用后缀sed和... oops备份文件,您提供的脚本为2d,但file.csv不是f {1}}命令"。

sed

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

如果你想编写代码使它适用于BSD和GNU sed -i .bak -e 2d file.csv ,那么你必须将后缀附加到sed选项(GNU -i需要附加后缀到sed选项;它是如何识别是否有可选后缀):

-i

请注意,您不能使用空后缀,并且该命令适用于BSD sed -i.bak -e 2d file.csv 和GNU sed

在任一命令行中都不需要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的Apple文档 - 最初由Diego在他选择删除的answer中引用,sed选项采用的是表示用于备份副本的扩展名。

  

-i 扩展程序

     

就地编辑文件,使用指定的扩展名保存备份。如果给出了零长度扩展,则不会保存备份。不建议在就地编辑文件时给出零长度扩展,因为在磁盘空间耗尽的情况下存在损坏或部分内容的风险,等等。

答案 1 :(得分:2)

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

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