将带有混合空格/制表符的txt文件转换为制表符(如果可能)

时间:2010-07-18 17:22:32

标签: shell tabs whitespace

我有一些混合制表符/空格的源代码文件,我想将其转换为一个文件,在该文件中,它通过制表符自动替换给定制表符空间长度的所有缩进空格(例如tab = 2个空格)。

任何简单的解决方案(使用常见的Unix工具,MacOSX,bash或zsh)?一些sed脚本或Python命令左右?

谢谢, 阿尔伯特

7 个答案:

答案 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)

两件事,

  1. sed -i是您的朋友 - sed -i XXX.txt 's/^[ ]\{2\}/\t/g'
  2. 您无法使用正则表达式将制表符替换乘以空格长度。
  3. 鉴于我的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]

如果这不完全符合您的要求,可以进行调整。