Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 删除文件的第一行(如果为');它是空的_Shell_Unix_Sed - Fatal编程技术网

Shell 删除文件的第一行(如果为');它是空的

Shell 删除文件的第一行(如果为');它是空的,shell,unix,sed,Shell,Unix,Sed,如果文本文件的第一行为空,如何使用sed或其他标准UNIX工具删除该行。我试过这个命令: sed '/^$/d' < somefile sed'/^$/d'

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

sed '/^$/d' < somefile
sed'/^$/d'
但这将删除第一个空行,而不是文件的第一行(如果为空)。我能给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
#/bin/bash
对于$中的文件(查找一些目录-名称“*.csv”)
做
回显处理${FILE}
awk'{if(NR==1&&NF==0)next};1'<${FILE}>${FILE}.killfirstline
mv${FILE}.killfirstline${FILE}
完成

如果不需要执行此操作,可以使用
awk
将输出重定向到其他文件中

awk '{if (NR==1 && NF==0) next};1' somefile
这将打印文件的内容,除非它是第一行(
NR==1
),并且不包含任何数据(
NF==0

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

例如:

更新:

sed
解决方案也适用于就地更换:

sed -i.bak '1{/^$/d}'  somefile
原始文件将使用sed以
.bak
扩展名保存,请尝试以下操作:

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

这可能适合您:

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

sed中最简单的事情是:

sed '1{/^$/d}'
请注意,这不会删除包含所有空格的行,而只删除只包含一个换行符的行。要消除空白,请执行以下操作:

sed '1{/^ *$/d}'
要消除所有空白:

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

如果第一行为空,则删除实际目录下所有文件的第一行:

find-type f | xargs sed-i-e'2,$b'-e'/^$/d'

你所说的就地是什么意思?如果你是说“不生成临时文件”,我其实不在乎。我想我可以在以后重命名生成的文件。是的,我想知道您是否想就地修改文件本身。顺便说一句,我还尝试了
sed'1/^$/d'
,因为sed手册说,可以通过在命令前面加行号来限制命令。然而,我的GNU sed不喜欢这样。有什么提示吗?对不起,我更喜欢
awk
,而不是我偶尔使用的
sed
。我认为
awk
解决方案符合您的要求,不是吗?您的sed版本不起作用——它会杀死它遇到的第一个空行。但awk版本运行良好。我将用我在awk调用中编写的小包装脚本更新我的问题,使其看起来合适。@Arne。。抱歉,我粘贴了错误的字符串-我的答案已更新为正确的
sed
行:-/。。。刚才我被窃听到没有一个早期的sed解决方案。请注意,这个答案不需要像其他人那样使用GNU sed。你得到了一分。当我在Solaris机器上时,我将使用您的答案。在我的Mac上,我已经安装了gsed,但是有一个与BSD sed一起工作的解决方案也很好。这就是我一直在寻找的。我没有意识到,我不得不用花括号。sed的文档有点缺乏…@Arne一旦你决定在适当的地方使用它并使用
sed
,你就接受了更好的答案。(今天我学到了很多关于sed的知识:)很高兴一切顺利。BSD/macOS sed希望命令中有新行;这是有效的:`sed$'1{\n/^$/d\n}'
sed '1{/^$/d}'
sed '1{/^ *$/d}'
sed '1{/^[[:space:]]*$/d}'