2017-02-16 93 views
0

我想刪除某些文本文件中的所有空行。我可以做到這一點:如何刪除文本文件的空白處?

grep '[^[:blank:]]' <file1.dat> file1.dat.nospace

但我需要在一個目錄正的文件去做。我該怎麼做?

任何幫助,將不勝感激。謝謝!

回答

1

這裏有一個辦法:

for filename in *.dat; do 
    grep '[^[:blank:]]' < $filename > $filename.nospace 
done 

這裏是一個更強大的方式,一個在更多種情況下工作的:

find . -maxdepth 1 -type f -name "*.dat" | while read filename; do 
    grep '[^[:blank:]]' < "$filename" > "$filename.nospace" 
done 

這裏有一個更快的方式(在執行時間,但也在打字)。這是方式,我居然會做到這一點:

find *.dat -printf "grep '[^[:blank:]]' < \"%f\" > \"%f.nospace\"\n" | sh 

這裏是一個更強大的版本:

find . -maxdepth 1 -type f -name "*.dat" -printf "grep '[^[:blank:]]' < \"%f\" > \"%f.nospace\"\n" | sh 

PS:這裏是對非空行實際的正確的grep:

grep -v '^$' < $filename > $filename.nospace 
+0

爲什麼'grep'可以使用簡單的'sed'命令完成。請參閱下面的答案。 – anubhava

+0

這就是我一直在尋找的,謝謝! – NicolasG

+2

請注意,這實際上並不檢查空行,只有行以空格開始。 –

3

你可以用它與find

find . -name '*.dat' -exec sed -i.bak '/^[[:blank:]]*$/d' {} + 
+0

這不會提供所請求的結果 - 它會下降到子目錄中,並重命名原始文件「.bak」而不是創建新的「.nospace」。但總體來說它是一種更好的技術,我將它評爲3倍,與我的答案一樣快(3個vs 9個,7000個文件,總共73MB)。 – webb

+0

@webb不,它不重命名文件。當某個OP想要訪問原始文件時,它只是爲該場景保留原始文件的擴展名爲「.bak」。 – anubhava

+0

爲了防止下降到子目錄中,我們可以在'find'中添加'-maxdepth 1'選項。 – anubhava

1

這oneliner或許可以幫助你:

for a in /path/to/file_pattern*; do sed "/^\s*$/d" $a > $a.nospace;done