如何删除多个文件的尾部空格?
是否有任何工具/ 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:
要删除尾随的空白,你可以这样使用它:
$ 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'
感觉像最直接的阅读以及