编号标题

编号标题

我需要将空格转换为分层的编号列表,但发现这很难实现。

这就是我所追求的东西:

输入(可见):

    Project #1
         Subproject
              Task
    Project #2
         Subproject
              Task
              Task

输入(原始):

\tProject #1
\t\tSubproject
\t\t\tTask
\tProject #2
\t\tSubproject
\t\t\tTask
\t\t\tTask

期望的输出:

1: Project #1
     1.1: Subproject
          1.1.1: Task
2: Project #2
     2.1: Subproject
          2.1.1: Task
          2.1.2: Task

答案1

Perl 来救援!

perl -pe 'if (s/^\t(\t*)//) {
              $n[ length $1 ]++;
              splice @n, 1 + length $1;
          }
          print $1, join(".", @n), ": " ' -- file
  • s/^\t(\t+)//删除前导选项卡,但将它们(不包括第一个选项卡)捕获到$1.
  • 数组@n用于保存数字。与当前深度对应的数字增加++,其余数字将被删除(如果您要开始一个新的、嵌套较少的部分)。

答案2

解决方案(可以稍微优化):

$ cat file | perl -pe 's/^/\t/' | perl -pe 'if (s/^(\t+)//) {
              $n[length($1)-1]++;
              splice @n, length $1;
          }
          print $1, join(".", @n), ": " ' | perl -pe 's/^\t//'


1: Project #1
    1.1: Subproject
        1.1.1: Task
2: Project #2
    2.1: Subproject
        2.1.1: Task
        2.1.2: Task
3: 

相关内容