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