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