67

是否有任何工具/UNIX 单行可以就地删除多个文件的尾随空格。

例如,可以与find结合使用。

4

7 回答 7

152

你要

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

这将删除所有POSIX 标准定义的空白字符,包括垂直制表符和换页符。此外,它只会在尾随空格实际存在时进行替换,这与使用零个或多个匹配器 ( *) 的其他答案不同。

--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,\}$//' {} \+
于 2012-05-22T22:51:29.800 回答
14

与其他都需要 GNU sed 的解决方案不同,这个解决方案应该适用于任何实现 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 {} +
于 2012-05-23T06:05:05.333 回答
4

我一直在使用来修复空格:

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 样式的文件。
  • 只担心“正常”空白 - 如果您的文件中有垂直制表符等,则可能是故意的(测试代码或原始数据)。
  • 跳过 .git 和 .svn VCS 目录。
  • 只修改file认为是文本文件的文件。
  • 报告所有被跳过的路径。
  • 适用于任何文件名。
于 2012-05-23T12:35:19.563 回答
2

这个怎么样:

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

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

于 2012-05-22T22:33:08.193 回答
1

对于那些不是 sed 专家(包括我自己)的人,我创建了一个小脚本来使用 JavaScript 正则表达式来替换文件中的文本并进行替换:

http://git.io/pofQnQ

要删除尾随空格,您可以这样使用它:

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

享受

于 2014-07-26T02:51:51.087 回答
1

ex

尝试使用Ex 编辑器(Vim 的一部分):

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

注意:对于递归(bash4 和 zsh),您可以使用新的通配选项( **/*.*)。通过 启用shopt -s globstar

perl

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

根据Spring Framework Code Style

sed

对于使用sed,请检查:如何使用 sed 删除尾随空格?


另请参阅:如何递归删除所有文件的尾随空格?

于 2015-04-20T12:29:29.570 回答
0

出于某种原因,sed 和 perl 命令对我不起作用。这做到了:

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

感觉也是最直接的阅读

于 2016-09-24T07:43:18.123 回答