有没有工具或UNIX单行命令可以对多个文件进行原地去除尾随空格。
例如,可以与find结合使用的工具。
有没有工具或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,\}$//' {} \+
find -exec
命令有两个变体。第一个以;
结尾,对于find
返回的每个文件,它会运行一次command
。第二个以+
结尾,通过建立运行command
所需的文件列表来尽可能少地运行command
。由于;
变体需要使用反斜杠转义;
,因此我通常也将其应用于+
(尽管我认为对于+
而言并不是绝对必要的)。 - Tim Potefind
中使用 -exec
,因为所有的 {}
和 +
看上去就像是一堆无用的噪音。我更喜欢 find . -type f -name '*.txt' | xargs --replace=FILE sed --in-place 's/foo/baz/' FILE
,但可能因人而异 :) - sebsed
不支持长选项。我通过使用Homebrew(brew install gnu-sed
)安装GNU sed来使这个命令正常工作。 - amacleod与其他解决方案不同的是,这个方案不需要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 -i -e 's/[ \t]\+\(\r\?\)$/\1/'
(相同的sed wo.在EOF处添加换行符)不能保留DOS风格的结尾。使用gnu sed 4.8。例如,seq 2 | unix2dos | sed -e 's/[ \t]\+\(\r\?\)$/\1/' | xxd -p
输出 310a320a
应该是 310d0a320d0a
。 - CervEd-b
选项到 sed
命令中以保留 CLRF
。正则表达式可以保留 CLRF
,但是 sed
却不能。https://dev59.com/cW445IYBdhLWcg3w4-Be#11508669 - CervEdex
尝试使用 Ex编辑器(Vim的一部分):
$ ex +'bufdo!%s/\s\+$//e' -cxa *.*
注意:对于递归(bash4和zsh),您可以使用新的globbing选项 (**/*.*
)。通过shopt -s globstar
启用。
perl
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
sed
使用 sed
的方法,请查看:如何使用sed去除行末空格?
另请参阅:如何递归地删除所有文件的行末空格?
s/[ \t]+$//g
。 - Labo对于那些不是sed专家(包括我自己在内)的人,我创建了一个小脚本,使用JavaScript正则表达式来替换文件中的文本,并进行原地替换:
要去除尾随空格,您可以这样使用:
$ node sed.js "/^[\t ]*$/gm" "" file
享受
sed
和 perl
命令对我无效。
这个有效:find ./ -type f | rename 's/ +$//g'
感觉这个也是最直观易读的。