2012-06-27 58 views
6

如何刪除文本文件的第一行(!),如果它是空的,使用例如。 sed或其他標準UNIX工具。我試過這個命令:刪除文件的第一行,如果它是空的

sed '/^$/d' < somefile 

但是這將刪除第一個空行,而不是文件的第一行,如果它是空的。我可以給出一些關於行號的條件嗎?

隨着捷爾的答案,我建立了這個小腳本基於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 
+0

你是指就地刪除嗎? – Levon

+0

你是什麼意思?如果你的意思是「生成沒有臨時文件」,我其實不在乎。我想我可以在之後重新命名結果文件。 – Arne

+0

是的,我想知道你是否想在原地修改文件本身。 – Levon

回答

11

在sed最簡單的做法是:

sed '1{/^$/d}' 

請注意,這並不刪除包含所有空白的行,但只包含只不過是一條線單行換行。爲了擺脫空白:

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

,並消除所有空白:

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

這就是我正在尋找的。我沒有意識到,我不得不使用大括號。 sed的文檔有點缺乏... – Arne

+0

@Arne一旦你決定在原地做這個,並使用'sed',你接受了更好的答案。 (*我*今天學到了很多關於'sed'的知識:)很高興這一切都解決了。 – Levon

2

如果你沒有這樣做原地的,你可以使用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擴展

+0

您的sed版本不起作用 - 它會殺死它遇到的第一條空行。但awk版本工作正常。我會用我在awk調用中編寫的小包裝腳本更新我的問題,以使其看起來就地。 – Arne

+0

@Arne ..對不起,我粘貼了錯誤的字符串 - 我的答案已經更新了正確的'sed'行: -/...只是讓我沒有更早的sed解決方案。 – Levon

1

使用SED,試試這個:

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

或做出更改:

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

請注意,這個答案不像其他人那樣需要GNU sed。 –

+0

你明白這一點。當我在Solaris機器上時,我將使用您的答案。在我的Mac上,我安裝了gsed,但很高興有一個與BSD sed配合使用的解決方案。 – Arne

0

這可能會爲你工作:

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

刪除所有文件的第一行實際的目錄下,如果第一行是空:
find -type f | xargs sed -i -e '2,$b' -e '/^$/d'

0

最初的答案是正確的,還有一些額外的東西:如果你想遞歸地做這件事,並將其限制爲一個文件類型,那麼下面的代碼就可以做到這一點。

find . -name "*.py" -print0 | xargs -0 sed -i '1{/^$/d}' 

上面的示例搜索當前目錄下的所有*.py文件(Python文件)。更改擴展名,更改它所執行的文件。

相關問題