我有一些混合制表符/空格的源代码文件,我想将其转换为一个文件,在该文件中,它通过制表符自动替换给定制表符空间长度的所有缩进空格(例如tab = 2个空格)。
任何简单的解决方案(使用常见的Unix工具,MacOSX,bash或zsh)?一些sed脚本或Python命令左右?
谢谢, 阿尔伯特
答案 0 :(得分:5)
好的,给定的解决方案都没有让我满意,所以我自己编写了代码。 :)
见这里:
答案 1 :(得分:1)
根据源语言,您可以试用GNU indent。它可以执行大量与源代码缩进相关的事情,尽管它可能比您需要的更复杂。
例如,如果我将以下程序提供给indent -di0 <inputfile>
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
int j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("x");
}
}
}
它将替换为:
#include <stdio.h>
int
main(int argc, char **argv)
{
int i;
int j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
printf("x");
}
}
}
或者,如果你需要一些简单的东西,那就是expand/unexpand
命令。
答案 2 :(得分:0)
您可以使用正则表达式用制表符替换N个空格。例如在Python中:
import re
re.sub('[ ]{4}', '\t', text)
答案 3 :(得分:0)
两件事,
sed -i
是您的朋友 - sed -i XXX.txt 's/^[ ]\{2\}/\t/g'
鉴于我的AWK-fu不强(我不知道它是否可以做#2不能),我将编写一个PHP脚本来计算空格并用标签替换它们。
答案 4 :(得分:0)
sed -r 's/ {2}/\t/g' file
答案 5 :(得分:0)
这是Python中可能的解决方案:
import re
import fileinput
pat = re.compile("^( )+")
for line in fileinput.input(inplace=True):
print pat.sub(lambda m: "\t" * (m.end() // 2), line, 1),
答案 6 :(得分:0)
这会将前导空格(甚至穿插标签)转换为标签。通过设置变量指定要转换的空格数。流浪空间将崩溃为零。不会触及空格或制表符以外的任何字符后出现的空格和制表符。
tstop=2
sed "s/^\([[:blank:]]*\)\(.*\)/\1\n\2/;h;s/[^[\n]*//;x;s/\n.*//;s/ \{$tstop\}/X/g;s/ //g;G;s/\n//g" inputfile
示例:
[space][space][tab][tab][space][space][space][tab][space]TEXT[space][space][space]
将转换为
[tab][tab][tab][tab][tab]TEXT[space][space][space]
如果这不完全符合您的要求,可以进行调整。