我正在使用 Solaris 10。一次从多个文件中删除空行的最简单方法是什么?
答案1
一个快速的小脚本应该可以工作。我有这从 nixCraft 试了一下,效果很好。
#!/bin/sh
files="/home/me/data/*.txt"
for i in $files
do
sed '/^$/d' $i > $i.out
mv $i.out $i
done
$files
根据您的需要进行更换。
答案2
删除所有空白行是最简单的:
sed -i.bak '/^$/d' $FILES
这将创建一个扩展名为 的备份.bak
,如果您不需要备份,请将其删除。
如果您也想删除带有空格的行(并且仅删除空格),请添加\W*
:
sed -i.bak '/^\W*$/d' $FILES
这适用于--posix
gnu sed 中的选项(关闭 gnu 扩展,所以我认为这应该适用于Solaris):
sed -i.bak '/^[ \t]*$/d' $FILES
如有必要,添加更多空白字符。
答案3
仅删除尾随空行的不同方法:
printf %s\\n "$(cat file)"|sponge file
tac file|awk /./,0|tac|sponge file
perl -0777 -pi -e 's/\n*$/\n/' file
gsed -i ':1;/^\n*$/{$d;N;b1}' file
bsdsed -i '' -e :1 -e '/^\n*$/{$d;N;b1' -e '}' file
命令替换会删除所有尾随换行符,例如echo "$(printf 'a\n\n')b"
prints ab
。
sponge
来自 moreutils。
在 BSD 中替换tac
为。tail -r
perl -0777
设置$_
为整个输入并在每行后-p
打印。$_
看man perlrun
。
:
设置标签,b
分支到标签,$d
删除最后一行的模式空间,并将N
下一行追加到模式空间。
GNUsed
允许在:
and之后使用分号,b
但 POSIX 和 BSDsed
不允许。-i
适用于 GNUsed
但不适用于 BSD sed
,-i ''
适用于 BSDsed
但不适用于 GNU sed
。
答案4
您可以使用以下单行命令删除多个文件中的空白行
find directoryname -name "filename" -print | xargs sed -i '/^$/d'
例如,如果您想从当前目录及其子目录中找到的所有文件中删除空行,您可以使用以下命令:
find . -name "*.*" -print | xargs sed -i '/^$/d'