如何删除尾随递归所有文件的空白?(How to remove trailing whitespace

2019-07-20 00:36发布

你怎么能删除所有整个项目的尾随空白的? 开始在根目录下,并从所有文件夹中的所有文件删除尾随空白。

另外,我希望能够直接修改该文件,而不是只打印所有到标准输出。

Answer 1:

下面是一个OS X> = 10.6雪豹溶液。

它忽略git的和.svn文件夹及其内容。 此外,它不会留下一个备份文件。

export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"


Answer 2:

使用:

find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'

如果你不希望产生的名为“.bak”的文件:

find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'

作为zsh的用户,则可以省略打电话找,而是使用:

perl -pi -e 's/ +$//' **/*

注意:为了避免破坏.git目录,尝试添加: -not -iwholename '*.git*'



Answer 3:

两个替代方法这也与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)

Git仓库,具体的解决方案通过垫,它使用-I的选项git grep跳过这混帐认为是二进制文件:

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'


Answer 4:

在bash:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

注:如果您使用.git仓库,试着加入: -not -iwholename '.git'



Answer 5:

这在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'


Answer 6:

确认是为这样的任务做。

它的工作原理就像grep的,但他知道不要陷入像.svn文件,git的,将该.cvs等场所

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

大部分不是通过查找/ grep的篮球跳跃更容易。

确认是通过最包管理器(作为ACKACK-grep)来提供。

这只是一个Perl程序,所以它也可以在你可以下载并运行一个单一的文件版本。 请参阅: 确认安装



Answer 7:

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框架的代码样式 。



Answer 8:

我结束了不使用发现,而不要创建备份文件。

sed -i '' 's/[[:space:]]*$//g' **/*.*

根据文件树的深度,这(短版本)可能足以满足您的需求。

注:这也需要二进制文件,例如。



Answer 9:

相反,排除的文件,这里是显式白名单的文件上面的变化,根据文件扩展名,要脱光,随意季节品尝:

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:]]*$//"


Answer 10:

我结束了在运行此,这是POJO和亚当斯的版本之间的混合。

它将清除这两个结尾的空白,同时也尾随空白的另一种形式,回车:

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”。 但要注意,它触动二进制文件,如果你有一些。 使用-iname "*.py" -or -iname "*.php"-type f ,如果你只希望它触及如的.py和.PHP-文件。

更新2:现在在行尾取代各类场所(如这意味着标签井)



Answer 11:

这种运作良好..添加/删除--include为特定的文件类型:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'


Answer 12:

红宝石:

irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }


Answer 13:

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:]我通常不会看到竖直突出,形成饲料和非易碎空间。 您的测量可能会有所不同。



Answer 14:

这对我来说是什么在起作用(Mac OS X的10.8,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/' \{} \;

删除尾随空格,制表符替换用空格,取代Windows CRLF使用Unix \n

有趣的是,我要运行这个3-4倍之前的所有的文件被固定,所有的清洁gsed说明。



文章来源: How to remove trailing whitespace of all files recursively?