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

发布于 2024-09-10 08:51:58 字数 1539 浏览 5 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

GRAY°灰色天空 2024-09-17 08:51:58

根据源语言,您可以尝试 GNU 缩进。它可以做很多与源代码缩进相关的事情,尽管它可能比您需要的更复杂。

例如,如果我将以下程序提供给 indent -di0

#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命令。

Depending on the source language, you could try out GNU indent. It can do a large number of things relating to the indentation of source code, though it might be more complex than you need.

For example, if I give the following program to 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");
    }
  }
}

It will replace it with:

#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");
        }
    }
}

Or, if you need something stupid simple, there is the expand/unexpand commands.

陌上青苔 2024-09-17 08:51:58

您可以使用正则表达式将 N 个空格替换为制表符。例如在 Python 中:

import re
re.sub('[ ]{4}', '\t', text)

You could use a regular expression to replace N spaces by a tab charater. For example in Python:

import re
re.sub('[ ]{4}', '\t', text)
长梦不多时 2024-09-17 08:51:58

有两件事,

  1. sed -i 是你的朋友 - sed -i XXX.txt 's/^[ ]\{2\}/\t/g'
  2. 你可以' t 使用正则表达式将制表符替换乘以空格长度。

鉴于我的 AWK-fu 并不强大(而且我不知道它是否可以做到 #2 不能做到的事情),我将编写一个 PHP 脚本来计算空格并将其替换为制表符。

Two things,

  1. sed -i is your friend - sed -i XXX.txt 's/^[ ]\{2\}/\t/g'
  2. You can't make regular expression to multiply the tab replacement by the space length.

Given my AWK-fu is not strong (and I don't know if it can do what #2 can't), I will write a PHP script to calculate the spaces and replace them with tabs.

小傻瓜 2024-09-17 08:51:58
sed -r 's/ {2}/\t/g' file
sed -r 's/ {2}/\t/g' file
神经大条 2024-09-17 08:51:58

以下是 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),

Here is a possible solution in 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),
↘紸啶 2024-09-17 08:51:58

这会将前导空格(甚至散布有制表符)转换为制表符。通过设置变量来指定要转换的空格数。杂乱的空间将被塌陷为空。出现在除空格或制表符之外的任何字符之后的空格和制表符将不会被触及。

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]

如果这不完全是您想要的,可以进行调整。

This will convert leading spaces (even interspersed with tabs) into tabs. Specify the number of spaces to convert by setting the variable. Stray spaces will be collapsed to nothing. Spaces and tabs that appear after any character other than space or tab will not be touched.

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

Example:

[space][space][tab][tab][space][space][space][tab][space]TEXT[space][space][space]

will be converted to

[tab][tab][tab][tab][tab]TEXT[space][space][space]

If that's not exactly what you're looking for, adjustments can be made.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文