我有一些源代码文件,其中混合了制表符/空格,我想将其转换为一个文件,其中所有缩进空格都被自动替换为给定制表符长度的制表符(例如 tab = 2 spaces)。
有没有简单的解决方案(使用常见的Unix工具、MacOSX、bash或zsh)?一些sed脚本或Python命令之类的东西?
谢谢, 阿尔伯特
有没有简单的解决方案(使用常见的Unix工具、MacOSX、bash或zsh)?一些sed脚本或Python命令之类的东西?
谢谢, 阿尔伯特
好的,给出的解决方案都不能满足我的需求,所以我自己编写了代码。 :)
请参见这里:
根据源语言的不同,您可以尝试使用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
命令。
import re
re.sub('[ ]{4}', '\t', text)
sed -r 's/ {2}/\t/g' file
以下是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),
"\t \t"
应该变成 "\t" * 3
。 - Albert^( |\t)+
”,它是否有效?我想我并不完全理解要求。编辑: 新正则表达式中是两个空格,行内代码标记不幸地折叠了空格。 - Philipp这将把前导空格(即使与制表符交替)转换为制表符。通过设置变量来指定要转换的空格数量。杂散的空格将被折叠成空白。任何字符之后出现的空格和制表符都不会被触及。
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]
如果这并不完全符合您的要求,我们可以进行调整。
...[制表符][空格]文本
,至少那是我想要的。 - Alberttstop=2
,你希望[tab][space][tab]...TEXT
看起来像什么?那么[tab][space][space]TEXT
呢? - Dennis Williamson两件事情,
sed -i
是你的好朋友 - sed -i XXX.txt 's/^[ ]\{2\}/\t/g'
鉴于我的 AWK 技能不强(而且我不知道它是否能做到 #2 无法做到的),我将编写一个 PHP 脚本来计算空格并用制表符替换它们。