如何将制表符转换为一个目录的每个文件中的空格(可能递归)?
此外,是否有一种方法来设置每个制表符的空格数?
如何将制表符转换为一个目录的每个文件中的空格(可能递归)?
此外,是否有一种方法来设置每个制表符的空格数?
当前回答
使用vim-way:
$ ex +'bufdo retab' -cxa **/*.*
做备份!在执行上述命令之前,因为它可能损坏您的二进制文件。 要使用globstar(**)进行递归,请通过shop -s globstar激活。 指定特定的文件类型,例如:**/*.c。
修改制表符,添加+'set ts=2'。
然而,缺点是它可以替换字符串中的制表符。
因此,为了更好的解决方案(使用代换法),尝试:
$ ex -s +'bufdo %s/^\t\+/ /ge' -cxa **/*.*
或者使用ex编辑器+扩展实用程序:
$ ex -s +'bufdo!%!expand -t2' -cxa **/*.*
有关尾随空格,请参见:如何为多个文件删除尾随空格?
你可以在你的.bash_profile中添加以下函数:
# Convert tabs to spaces.
# Usage: retab *.*
# See: https://stackoverflow.com/q/11094383/55075
retab() {
ex +'set ts=2' +'bufdo retab' -cxa $*
}
其他回答
您可以使用find与制表符到空格包。
首先,安装制表符到空格
npm install -g tabs-to-spaces
然后,从项目的根目录运行这个命令;
find . -name '*' -exec t2s --spaces 2 {} \;
这将把每个文件中的每个制表符替换为2个空格。
你可以使用vim:
find -type f \( -name '*.css' -o -name '*.html' -o -name '*.js' -o -name '*.php' \) -execdir vim -c retab -c wq {} \;
正如Carpetsmoker所说,它将根据你的vim设置重新标签。文件中的modeline(如果有的话)。此外,它不仅将替换行首的制表符。这通常不是你想要的。例如,你可能有文字,包含制表符。
您可以使用通常可用的pr命令(此处的手册页)。例如,要将制表符转换为四个空格,可以这样做:
pr -t -e=4 file > file.expanded
-t抑制头文件 -e=num将制表符扩展为num个空格
递归转换目录树中的所有文件,跳过二进制文件:
#!/bin/bash
num=4
shopt -s globstar nullglob
for f in **/*; do
[[ -f "$f" ]] || continue # skip if not a regular file
! grep -qI "$f" && continue # skip binary files
pr -t -e=$num "$f" > "$f.expanded.$$" && mv "$f.expanded.$$" "$f"
done
跳过二进制文件的逻辑来自这篇文章。
注意:
在git或svn repo中这样做可能是危险的 如果您的代码文件在字符串字面值中嵌入了空白制表符,那么这不是正确的解决方案
对于递归应用程序,我喜欢上面的“find”示例。为了使其具有非递归性,只更改当前目录中匹配通配符的文件,shell glob扩展可以满足少量文件的需求:
ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh -v
如果在您相信它工作之后希望它保持沉默,只需在sh命令的末尾加上-v。
当然,您可以在第一个命令中选择任何一组文件。例如,以受控的方式只列出一个特定的子目录(或多个目录),如下所示:
ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
或者反过来运行find(1)与深度参数等的一些组合:
find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
下载并运行以下脚本,递归地将纯文本文件中的硬选项卡转换为软选项卡。
在包含纯文本文件的文件夹中执行脚本。
#!/bin/bash
find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
echo "Converting... "$file"";
data=$(expand --initial -t 4 "$file");
rm "$file";
echo "$data" > "$file";
}; done;