如何删除整个项目的所有尾随空格?从根目录开始,并从所有文件夹中的所有文件中删除尾随空格。
另外,我希望能够直接修改文件,而不仅仅是将所有内容打印到标准输出。
这是一个 OS X >= 10.6 Snow Leopard 解决方案。
它忽略 .git 和 .svn 文件夹及其内容。它也不会留下备份文件。
export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | perl -0ne 'print if -T' | xargs -0 sed -Ei 's/[[:blank:]]+$//'
利用:
find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'
如果您不希望生成“.bak”文件:
find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
作为 zsh 用户,您可以省略 find 调用,而是使用:
perl -pi -e 's/ +$//' **/*
注意:为防止破坏.git
目录,请尝试添加:-not -iwholename '*.git*'
.
两种替代方法也适用于DOS 换行符(CR/LF),并且在避免二进制文件方面做得很好:
检查 MIME 类型是否以开头的通用解决方案text/
:
while IFS= read -r -d '' -u 9
do
if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
then
sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
else
echo "Skipping $REPLY" >&2
fi
done 9< <(find . -type f -print0)
Mat的 Git 存储库特定解决方案,它使用-I
选项git grep
跳过 Git 认为是二进制的文件:
git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
在 Bash 中:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
注意:如果您使用的是.git
存储库,请尝试添加:-not -iwholename '.git'
.
这在 OSX 10.5 Leopard 中对我有用,它不使用 GNU sed 或 xargs。
find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"
如果您有需要排除的文件(我做过),请小心这一点!
您可以使用 -prune 忽略某些目录或文件。对于 git 存储库中的 Python 文件,您可以使用以下内容:
find dir -not -path '.git' -iname '*.py'
Ack 就是为这种任务而设计的。
它的工作方式与 grep 类似,但它知道不要进入 .svn、.git、.cvs 等位置。
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
比使用 find/grep 跳过障碍要容易得多。
Ack 可通过大多数包管理器(如ack或ack-grep)获得。
它只是一个 Perl 程序,因此它也有单文件版本,您只需下载并运行即可。请参阅:确认安装
ex
尝试使用Ex 编辑器(Vim 的一部分):
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
注意:对于递归(bash4 和 zsh),我们使用新的通配选项( **/*.*
)。通过 启用shopt -s globstar
。
您可以将以下功能添加到您的.bash_profile
:
# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
ex +'bufdo!%s/\s\+$//e' -cxa $*
}
sed
对于使用sed
,请检查:如何使用 sed 删除尾随空格?
find
找到以下脚本(例如remove_trail_spaces.sh
)从文件中删除尾随空格:
#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively
case "$OSTYPE" in
darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
find . -type f -name \*.bak -print0 | xargs -0 rm -v
;;
*)
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac
从要扫描的目录运行此脚本。最后在 OSX 上,它将删除所有以.bak
.
要不就:
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
这是Spring Framework Code Style推荐的方式。
我最终没有使用 find 也没有创建备份文件。
sed -i '' 's/[[:space:]]*$//g' **/*.*
根据文件树的深度,这(较短的版本)可能足以满足您的需要。
注意这也需要二进制文件,例如。
这里不是排除文件,而是上面明确的白名单文件的变体,基于文件扩展名,你想要剥离,随意调味:
find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
我最终运行了这个,它是 pojo 和 adams 版本的混合。
它将清除尾随空格以及另一种形式的尾随空格,即回车:
find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
-exec sed -i 's/[:space:]+$//' \{} \; \
-exec sed -i 's/\r\n$/\n/' \{} \;
如果有,它不会触及 .git 文件夹。
编辑:在评论之后让它更安全一点,不允许在其中获取带有“.git”或“.svn”的文件。但要注意,如果你有一些二进制文件,它会触及二进制文件。如果您只希望它接触例如 .py 和 .php 文件,请使用-iname "*.py" -or -iname "*.php"
after 。-type f
更新 2:它现在替换了行尾的各种空格(这也意味着制表符)
红宝石:
irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }
这很好用.. add/remove --include 用于特定文件类型:
egrep -rl ' $' --include *.c * | xargs sed -i 's/\s\+$//g'
1)许多其他答案使用-E
. 我不知道为什么,因为那是未记录的 BSD 兼容性选项。-r
应改为使用。
2)其他答案使用-i ''
。那应该只是-i
(或者-i''
如果愿意的话),因为-i
后面有后缀。
3)Git具体解决方案:
git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'
git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'
第一个注册一个 git 别名check-whitespace
,其中列出了带有尾随空格的文件。第二个运行sed
在他们身上。
我只使用\t
而不是[:space:]
因为我通常看不到垂直标签、换页和不可破坏的空格。您的测量值可能会有所不同。
我使用正则表达式。4个步骤:
这将删除所有文件中每行末尾的所有尾随空格。您可以排除一些不符合此需求的文件。
这对我有用(Mac OS X 10.8,Homebrew 安装的 GNU sed):
find . -path ./vendor -prune -o \
\( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
-exec gsed -i -E 's/\t/ /' \{} \; \
-exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
-exec gsed -i -E 's/\r\n/\n/' \{} \;
删除尾随空格,用空格替换制表符,用 Unix 替换 Windows CRLF \n
。
有趣的是,在所有文件得到修复之前,我必须运行 3-4 次,所有清理gsed
指令。