如何删除多个文件的尾部空格?

是否有任何工具/ UNIX单一的内衬将在原地移除多个文件的尾随空白。

比如可以和find一起使用的一个。

你要

sed --in-place 's/[[:space:]]\+$//' file 

这将删除所有 POSIX标准定义的空白字符,包括垂直制表符和换页符。 而且,如果尾部空白实际存在,则它将只进行replace,而不像使用零或多个匹配器( * )的其他答案。

--in-place就是-i的长形。 我更喜欢在脚本中使用长格式,因为它更倾向于说明标志实际上做了什么。

它可以很容易地与像这样find

 find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+ 

如果你在Mac上

正如在评论中指出的那样,如果你没有安装GNU工具,上述不起作用。 如果是这种情况,可以使用以下方法:

 find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+ 

与其他所有需要GNU sed的解决scheme不同,这个应该在任何实现POSIX标准命令的Unix系统上工作。

 find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && mv /tmp/.$$ "$i";done' arg0 {} + 

编辑:这个稍微修改版本保留文件的权限:

 find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} + 

我一直在使用它来解决空白:

 while IFS= read -r -d '' -u 9 do if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]] then sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$a\' -- "$REPLY" else echo "Skipping $REPLY" >&2 fi done 9< <(find . \( -type d -regex '^.*/\.\(git\|svn\|hg\)$' -prune -false \) -o -type f -print0) 

特征:

  • 保持回车(不像[:space:] ),所以在Windows / DOS风格的文件上工作正常。
  • 只担心“正常”的空格 – 如果你的文件中有垂直标签或者这样的标签,可能是有意的(testing代码或原始数据)。
  • 跳过.git和.svn VCS目录。
  • 只修改文件认为是文本文件的文件。
  • 报告跳过的所有path。
  • 适用于任何文件名。

对于那些不是sed gurus的人(包括我自己),我已经创build了一个小脚本来使用JavaScript正则expression式replace文件中的文本,并进行replace:

http://git.io/pofQnQ

要删除尾随的空白,你可以这样使用它:

 $ node sed.js "/^[\t ]*$/gm" "" file 

请享用

尝试vim方式:

 $ ex +'bufdo!%s/\s\+$//e' -cxa *.* 

对于recursion(bash4&zsh),您可以使用扩展匹配( **/*.* )。

使用sed ,检查: 如何删除尾随sed的空白?

另请参阅: 如何recursion删除所有文件的尾部空白?

或者通过perl

 find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \; 

按照Spring框架代码样式 。

这个怎么样:

 sed -e -i 's/[ \t]*$//' 

顺便说一句,这是一个方便的网站: http : //sed.sourceforge.net/sed1line.txt

出于某种原因,sed和perl命令不适合我。 这样做:

 find ./ -type f | rename 's/ +$//g' 

感觉像最直接的阅读以及