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

Mik*_*maa 59 shell whitespace find in-place removing-whitespace

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

例如,可以与find结合使用.

Tim*_*ote 129

你要

sed --in-place 's/[[:space:]]\+$//' file
Run Code Online (Sandbox Code Playgroud)

这将删除所有 POSIX标准定义的空白字符,包括垂直制表符和换页符.此外,如果尾随空格实际存在,它只会进行替换,而不像使用零或多个匹配器(*)的其他答案.

--in-place只是长形式-i.我更喜欢在脚本中使用长格式,因为它更倾向于说明标志实际上做了什么.

它可以find像这样轻松集成:

find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+
Run Code Online (Sandbox Code Playgroud)

如果你在Mac上

正如评论中指出的那样,如果您没有安装gnu工具,则上述操作无效.如果是这种情况,您可以使用以下内容:

find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
Run Code Online (Sandbox Code Playgroud)

  • `find -exec命令`有两种变体.第一个以`;`结尾.它为每个文件`find`返回运行`command`一次.第二个以`+`结尾.它通过构建运行`command` on的文件列表尽可能少地运行`command`.因为`;`变量*需要*反斜杠来逃避`;`,所以我通常也把它放在`+`上(虽然我不认为它对于`+`来说是绝对必要的). (6认同)
  • 谈论可读性(这都是品味的问题)但我从不使用`-exec`和`find`,因为所有`{} +`的东西就像线路噪音一样.我更喜欢`找到.-type f -name'*.txt'| xargs --replace = FILE sed --in-place的/ foo/baz /'FILE`但是YMMV :) (3认同)
  • 那么什么是\ +作为查找exec终结符的东西? (2认同)

jll*_*gre 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 {} +
Run Code Online (Sandbox Code Playgroud)

编辑:此略微修改的版本保留文件权限:

find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
Run Code Online (Sandbox Code Playgroud)