是否有任何工具/ UNIX单线程可以删除多个文件就地的尾随空格。
E.g。一个可以与 find 结合使用。
答案 0 :(得分:125)
你想要
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,\}$//' {} \+
答案 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样式的文件中可以正常工作。file
认为是文本文件的文件。答案 3 :(得分:1)
答案 4 :(得分:1)
对于那些不是sed guru(包括我自己)的人,我创建了一个小脚本来使用JavaScript正则表达式替换文件中的文本并进行替换:
要删除尾随空格,您可以使用它:
$ 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'
感觉就像最直接的读者一样