【问题标题】:Delete line from file at specified line number in bourne shell [duplicate]从bourne shell中指定行号的文件中删除行[重复]
【发布时间】:2013-03-02 06:28:18
【问题描述】:

我正在 Bourne Shell 中制作约会跟踪脚本,需要从文本文件中删除约会。如果我有行号,如何从不留空白的文件中删除一行?该文件如下所示:

1:19:2013:Saturday:16.00:20.30:Poker  
1:24:2013:Thursday:11.00:11.45:Project meeting  
1:24:2013:Thursday:14.00:15.10:CSS Meeting

【问题讨论】:

    标签: shell unix sed


    【解决方案1】:

    要删除第 5 行,请执行以下操作:

    sed -i '5d' file.txt
    

    对于可变行号:

    sed -i "${line}d" file.txt
    

    如果-i 选项在您的 sed 风格中不可用,您可以使用临时文件来模拟它:

    sed "${line}d" file.txt > file.tmp && mv file.tmp file.txt
    

    【讨论】:

    • 在 MacOS X 上 -i 需要一个备份文件扩展名的参数。您可以使用空字符串省略它以获得所需的相同行为:sed -i "" '5d' file.txt
    • 在我的系统上,当处理大文件时,sed 看起来比 headtail 的简单组合慢一个数量级:这是一个没有就地的更快方法的示例模式:delete-line() { local filename="$1"; local lineNum="$2"; head -n $((lineNum-1)) "$filename"; tail +$((lineNum+1)) "$filename"; }
    【解决方案2】:

    按预约(行)号删除:

    sed -i '3d' input
    

    按名称删除:

    sed -i '/:Poker/d' input
    

    如果就地 (-i) 选项在您的系统上不起作用,您可以这样做:

    sed '/:Poker/d' input > input.tmp && mv input.tmp input
    

    【讨论】:

    • POSIX sed 不支持 sed -i。由于我们在这里使用的是 Bourne,因此有可能这不是 Linux。例如,它在 Solaris /usr/bin/sed 中不起作用。
    【解决方案3】:

    这是一个使用 awk 的快速入门:

    lineToDelete=$1
    awk "NR != $lineToDelete"
    

    【讨论】:

    • 这不会从文件中删除该行。它将文件打印到 STDOUT,除了这一行。
    猜你喜欢
    • 2011-01-07
    • 2011-02-11
    • 1970-01-01
    • 2014-06-03
    • 2016-08-13
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多