在我的Mac上,当我尝试运行时:
sed -i 2d file.csv
Run Code Online (Sandbox Code Playgroud)
从Unix脚本的答案中删除CSV文件的第一行,我收到以下错误:
sed: 1: "file.csv": invalid command code f
Run Code Online (Sandbox Code Playgroud)
如果我想删除前两行,我该怎么办file.csv?
Jon*_*ler 16
在Mac上,BSD sed需要备份的后缀(但后缀可以是空字符串'') - 它不是可选的,因为它与GNU一样sed.因此,您的命令被解释为"备份带有后缀2d和... oops 的文件,您提供的脚本是file.csv,但f不是sed命令".
sed -i .bak -e 2d file.csv
Run Code Online (Sandbox Code Playgroud)
这将从CSV文件中删除第一行数据(保留标题行).
如果你想编写代码使它适用于BSD和GNU sed,那么你必须将后缀附加到-i选项(GNU sed需要附加到-i选项的后缀;这就是它如何识别是否有可选的后缀):
sed -i.bak -e 2d file.csv
Run Code Online (Sandbox Code Playgroud)
请注意,您不能使用空后缀并使命令适用于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
Run Code Online (Sandbox Code Playgroud)
有了这些,如果中断或其他信号终止脚本,您可能需要添加trap命令来清理中间.bak文件.
要引用Apple文档sed- 最初由Diego在他选择删除的答案中引用,该-i选项会使用一个参数来指示用于备份副本的扩展名.
-i延期就地编辑文件,使用指定的扩展名保存备份.如果给出了零长度扩展,则不会保存备份.在就地编辑文件时,建议不要给出零长度扩展,因为在磁盘空间耗尽的情况下,您可能会出现损坏或部分内容等风险.