【问题标题】:Unix script to delete the first line of a file on a Mac用于在 Mac 上删除文件第一行的 Unix 脚本
【发布时间】: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的前两行怎么办?

【问题讨论】:

    标签: macos unix sed


    【解决方案1】:

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

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

    【讨论】:

    • 如果我没有标题怎么办?
    • 然后使用 '1,2d' 而不是 '2,3d'
    • 如果我不想创建出现的备份文件怎么办?
    • 那就看Diego下面的帖子,不要用.bak
    • 这有效,从文件中删除前两个数据行,并且适用于 GNU sed 和 BSD sed。但是,您还没有真正解释它为什么起作用。
    【解决方案2】:

    在 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分机

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

    【讨论】:

    • 这会删除第二行中的项目,但不会删除第一行:" sed 2d file.csv > file.csv.bak && cp file.csv.bak file.csv rm -f file。 csv.bak"
    • 我介绍了如何删除文件中的前两行,以及如何删除文件中的前两行数据。你还想要什么?
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2017-01-25
    • 2016-02-06
    相关资源
    最近更新 更多