是否有任何工具/UNIX 单行可以就地删除多个文件的尾随空格。
例如,可以与find结合使用。
你要
sed --in-place 's/[[:space:]]\+$//' file
这将删除所有POSIX 标准定义的空白字符,包括垂直制表符和换页符。此外,它只会在尾随空格实际存在时进行替换,这与使用零个或多个匹配器 ( *
) 的其他答案不同。
--in-place
只是 的长形式-i
。我更喜欢在脚本中使用长格式,因为它往往更能说明标志的实际作用。
它可以find
像这样轻松集成:
find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+
正如评论中所指出的,如果您没有安装 gnu 工具,上述方法将不起作用。如果是这种情况,您可以使用以下方法:
find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
与其他都需要 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 {} +
我一直在使用它来修复空格:
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 样式的文件。file
认为是文本文件的文件。对于那些不是 sed 专家(包括我自己)的人,我创建了一个小脚本来使用 JavaScript 正则表达式来替换文件中的文本并进行替换:
要删除尾随空格,您可以这样使用它:
$ node sed.js "/^[\t ]*$/gm" "" file
享受
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 删除尾随空格?
另请参阅:如何递归删除所有文件的尾随空格?
出于某种原因,sed 和 perl 命令对我不起作用。这做到了:
find ./ -type f | rename 's/ +$//g'
感觉也是最直接的阅读