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

aydmsdu9  于 2022-11-16  发布在  Shell
关注(0)|答案(7)|浏览(205)

是否有任何工具/ UNIX单行程序可以就地删除多个文件的尾随空格?
例如,可与 find 结合使用的字符串。

bzzcjhmw

bzzcjhmw1#

你要

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

pvabu6sv2#

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

f1tvaqid3#

我一直在用这个来修复空白:

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

ovfsdjhp4#

不如这样吧:

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

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

h79rfbju

h79rfbju5#

x1月0n1x日

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

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

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

perl

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

根据Spring框架代码样式。

sed

若要使用sed,请检查:How to remove trailing whitespaces with sed?
另请参阅:How to remove trailing whitespace of all files recursively?

4dc9hkyq

4dc9hkyq6#

对于那些不是sedMaven的人(包括我自己),我创建了一个小脚本来使用JavaScript正则表达式替换文件中的文本,并在适当的位置进行替换:
http://git.io/pofQnQ
要删除尾随空格,可以按如下方式使用:

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

尽情享受

swvgeqrz

swvgeqrz7#

由于某种原因,sedperl命令对我不起作用。

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

感觉也是最直接的一本。

相关问题