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

时间:2012-05-22 22:27:30

标签: shell find whitespace removing-whitespace in-place

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

E.g。一个可以与 find 结合使用。

7 个答案:

答案 0 :(得分:125)

你想要

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,\}$//' {} \+

答案 1 :(得分:13)

与其他所有需要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 {} +

答案 2 :(得分:4)

我一直在使用this修复空白:

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认为是文本文件的文件。
  • 报告所有已跳过的路径。
  • 使用任何文件名。

答案 3 :(得分:1)

这个怎么样:

sed -e -i 's/[ \t]*$//'
不过,这是一个方便的网站:http://sed.sourceforge.net/sed1line.txt

答案 4 :(得分:1)

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

http://git.io/pofQnQ

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

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

享受

答案 5 :(得分:1)

ex

尝试使用Ex editor(Vim的一部分):

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

注意:对于递归(bash4&amp; zsh),您可以使用a new globbing option**/*.*)。由shopt -s globstar启用。

perl

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

根据Spring Framework Code Style

sed

要使用sed,请检查:How to remove trailing whitespaces with sed?


另请参阅:How to remove trailing whitespace of all files recursively?

答案 6 :(得分:0)

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

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

感觉就像最直接的读者一样