【问题标题】:Delete first line of file if it's empty如果文件为空,则删除文件的第一行
【发布时间】:2012-06-28 22:16:32
【问题描述】:

如何删除文本文件的第一行(!),如果它是空的,例如使用sed 或其他标准 UNIX 工具。我试过这个命令:

sed '/^$/d' < somefile

但这将删除第一个空行,而不是文件的第一行,如果它是空的。我可以给 sed 一些关于行号的条件吗?

根据 Levon 的回答,我基于 awk 构建了这个小脚本:

#!/bin/bash

for FILE in $(find some_directory -name "*.csv")
do
    echo Processing ${FILE}

    awk '{if (NR==1 && NF==0) next};1' < ${FILE} > ${FILE}.killfirstline
    mv ${FILE}.killfirstline ${FILE}

done

【问题讨论】:

  • 就地是什么意思?如果您的意思是“不生成临时文件”,我实际上不在乎。我想我可以在之后重命名生成的文件。
  • 是的,我想知道您是否想就地修改文件本身。
  • 顺便说一句,我也试过sed '1 /^$/d',因为 sed 手册说,可以通过在命令前加上行号来限制命令。但是,我的 GNU sed 不喜欢这样。有什么提示吗?
  • 对不起,我更喜欢awk,而不是sed,我只是偶尔使用。
  • 我认为awk 解决方案可以满足您的需求,不是吗?

标签: shell unix sed


【解决方案1】:

sed中最简单的就是:

sed '1{/^$/d}'

请注意,这不会删除包含所有空格的行,而只会删除仅包含单个换行符的行。摆脱空白:

sed '1{/^ *$/d}'

并消除所有空格:

sed '1{/^[[:space:]]*$/d}'

【讨论】:

  • 这就是我想要的。我没有意识到,我不得不使用花括号。 sed 的文档有点欠缺...
  • @Arne 一旦你决定就地做它并使用sed,你接受了更好的答案。 (今天学到了很多关于 sed 的知识 :) 很高兴这一切都成功了。
  • BSD/macOS sed 需要命令中的换行符;这有效:`sed $'1{\n/^$/d\n}'
【解决方案2】:

使用 sed,试试这个:

sed -e '2,$b' -e '/^$/d' < somefile

或进行适当的更改:

sed -i~ -e '2,$b' -e '/^$/d' somefile

【讨论】:

  • 请注意,此答案不像其他答案那样需要 GNU sed。
  • 你得到了一点。当我在 Solaris 机器上时,我会使用你的答案。在我的 Mac 上,我安装了 gsed,但很高兴有一个适用于 BSD sed 的解决方案。
【解决方案3】:

如果您不必就地执行此操作,您可以使用 awk 并将输出重定向到不同的文件中。

awk '{if (NR==1 && NF==0) next};1' somefile

这将打印文件的内容,除非它是第一行 (NR == 1) 并且不包含任何数据 (NF == 0)。

NR 当前行号,NF 给定行上由空格/制表符分隔的字段数

例如,

$ cat -n data.txt
     1  
     2  this is some text
     3  and here
     4  too
     5  
     6  blank above
     7  the end

$ awk '{if (NR==1 && NF==0) next};1' data.txt | cat -n
     1  this is some text
     2  and here
     3  too
     4  
     5  blank above
     6  the end

cat -n data2.txt
     1  this is some text
     2  and here
     3  too
     4  
     5  blank above
     6  the end

$ awk '{if (NR==1 && NF==0) next};1' data2.txt | cat -n
     1  this is some text
     2  and here
     3  too
     4  
     5  blank above
     6  the end

更新

这个sed 解决方案也适用于就地替换:

sed -i.bak '1{/^$/d}'  somefile

原始文件将以.bak 扩展名保存

【讨论】:

  • 您的 sed 版本不起作用——它会杀死它遇到的第一个空行。但是 awk 版本运行良好。我将使用围绕 awk 调用编写的小包装脚本更新我的问题,使其看起来就地。
  • @Arne .. 抱歉,我粘贴了错误的字符串 - 我的答案已更新为正确的 sed 行:-/ ... 只是让我之前没有 sed 解决方案。
【解决方案4】:

如果第一行为空,则删除实际目录下所有文件的第一行:
find -type f | xargs sed -i -e '2,$b' -e '/^$/d'

【讨论】:

    【解决方案5】:

    这可能对你有用:

    sed '1!b;/^$/d' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多