2017-02-16 98 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