【发布时间】:2015-06-11 12:46:15
【问题描述】:
在我的 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的前两行怎么办?
【问题讨论】:
在我的 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 行(假设您有标题)
这个命令的作用是编辑被引用的文件,同时创建原始文件的备份(因此使用.bak)。行删除'2,3d'会删除原文件的第2行和第3行。
【讨论】:
sed 和 BSD sed。但是,您还没有真正解释它为什么起作用。
在 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 在他选择删除的 answer 中引用,-i 选项带有一个参数,该参数指示用于备份副本的扩展名.
-i分机就地编辑文件,以指定的扩展名保存备份。如果给出零长度扩展名,则不会保存备份。不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下,您可能会面临损坏或部分内容的风险。
【讨论】: