Answers:
请尝试以下操作:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
如果要四个空格,请尝试:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
每行替换多个标签。
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
(即“ +
”而不是“ \;
”),并且该find
版本支持(并且我个人还没有遇到任何不支持该功能的版本,但这不是POSIX标准),则可以大大提高速度,所以我猜可能会在某些系统上发生。请参见-exec command {} +
手册中的“ ”。与其sed
为每个文件启动一个实例,不如为构造一个带有系统支持的文件名参数的参数列表(getconf ARG_MAX
在我的系统上= 2097152),xargs
从而启动更少的sed
进程。
sed
不了解\t
制表符转义序列。您可以将其替换为文字制表符,可以在外壳程序中输入[Ctrl]+V, [Tab]
。
有很多方法可以做到这一点。如果您不小心,或者如果您不熟悉Linux,那么还有很多方法可以使自己立足。假设您可以通过使用类似方法find
或使用编辑器手动创建要转换的文件列表,只需将该列表传递到以下文件中即可。
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
可以用脚打死自己的一种方法是打错字,这样就可以将空文件移动到指定的所有文件名,从而删除所有文件的内容。因此,请小心并在备份的一小组文件上测试您首先执行的操作。
mv
以成功的条件为expand
:expand ... && mv ...
expand -t 4
将制表符扩展到4个空格。同样,此方法可以创建尾随换行符。但是否则它会起作用。
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
为每个输入行创建一个模板变量foo,因此您可以多次引用该输入。
-print0
并-0
告诉两个命令使用\ 0作为行分隔符而不是SPACE,因此此命令适用于带有空格的路径。
这个更好:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
因为如果其他任何文件正在使用该文件,则会将其弄乱。就像两个用户想同时使用它一样。
考虑到以下要求,我对此问题做了一些尝试:
最后一个要求是最难实现的,因为“扩展”不允许修改文件。
我想出了以下解决方案:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
这里是一些解释:
expand
,因此我假设他/她希望保留文本的对齐方式。