我刚刚继承了一个新的C ++项目,其中很多文件都带有制表符缩进,而较新的文件则带有空格。现在,我想将它们全部更改为仅使用空格。不用进入每个文件并使用EMacs自动缩进功能,有没有一种更有效的方法可以通过bash实现呢?
答案 0 :(得分:1)
我有两个答案。首先,为了回答您的特定问题,我将使用perl
或类似的方法,
replace-tab-indents.pl
#!/usr/bin/perl
while ($line = <STDIN>) {
while ($line =~ /^ *\t/) {
$line =~ s/^( *)\t/$1 /;
}
print(STDOUT $line);
}
这只处理行首的 TAB 。这对您的用例至关重要,因为您不想替换其他TAB。例如,它们是代码中某些静态字符串的一部分。
在shell脚本(例如:
for FILE in `find . -name *.cpp`; do
mv -i "$FILE" "$FILE.bak"
cat "$FILE.bak" | replace-tab-indents.pl > "$FILE"
done
在-name
上使用find
选项将您限制为仅源文件,从而避免了您在替换所有文件中的所有TAB时应注意的问题-在许多非源文件中,“ TAB”字节对于组成该文件的数据至关重要。
我的第二个答案是随便更改它们,而不是一次全部更改。
通过这种方式,您可以使用emacs(或vim,或者实际上是任何现代编辑器),这将是一种经过更多测试,可靠且可靠的方法。
使用TAB可以很好地编译文件,因此在您需要编辑给定文件之前,TAB缩进的出现不会影响您;在它影响您的确切时间点(即您第一次对其进行编辑),您可以使用编辑器重新缩进空格。简而言之,我的建议是按时/按需完成此操作,而不是一次完成。
换句话说,编译器不在乎缩进,只有您在意;而您唯一需要关心的是实际编辑给定的源文件时;因此,重新缩进源文件 并没有经验上的好处。
答案 1 :(得分:1)
使用任何使用find
的解决方案,都必须考虑所有可能的文件扩展名,并查看GCC manual,其中有很多。
Ack有一个非常好的文件选择选项,只需将--cc
作为参数来匹配C ++文件即可。
因此,替换所有C ++文件中的所有选项卡,包括使用的头文件:
ack --cpp -l --print0 . | xargs -0 -n1 sed -i -e 's/\t/ /'
ack
将在当前目录中递归查找所有C ++文件,并将仅文件名传递给sed
,后者将所有制表符替换为四个空格。
答案 2 :(得分:1)
这将递归遍历项目文件,并将选项卡扩展到空格。由于我确定您正在使用源代码管理,因此如果出现问题,您可以轻松地还原。
find /path/to/project -type f -name '*.cpp' -exec expand --initial {} +
默认值为8个空格,但是您可以使用--tabs=4
或任何想要的值。
--initial
选项将忽略非空格之后的标签。