将缩进转换为括号

时间:2015-11-13 18:16:38

标签: sed

我试图编写一个sed脚本来将缩进转换为等效的括号。

例如,括号应放在此

A
    A1
        A1a
    A2

B
    B1

这样看起来像这样

(A
    (A1
        (A1a))
    (A2))

(B
    (B1))

或者这个(一旦括号被放置,空格就不再重要了):

( A ( A1 ( A1a ) ) ( A2 ) )
( B ( B1 ) )

假设为了简单起见

  1. 每行只有一个令牌,
  2. 缩进按标签发生,
  3. 原则似乎很简单:

    1. 如果标记的缩进深度高于上一行的缩进深度,则在标记之前添加左括号;
    2. 计算当前行多于下一行的制表符数量,添加1并在令牌后放置多个右括号。
    3. 然而,教导sed一行的变化取决于另一条线的外观对我来说并不简单。

1 个答案:

答案 0 :(得分:1)

我不认为sed能够做到这一点。无论如何都不是一种可读和可维护的方式。

这里的GNU awk:

$ cat file
A
    A1
        A1a
    A2
    A3
B
    B1
        B1a
            B1aa
C

$ gawk '
      BEGIN { prev=-1 }
      {
          match($0, /^(\t*)(.*)/, a)
          level = length(a[1])
          close_parens = (level <= prev) ? prev - level + 1 : 0
          for (i=1; i<= close_parens; i++) printf ")"
          printf "\n%s(%s", a[1], a[2]
          prev = level
      }
      END {for (i=0; i<= level; i++) printf ")"; print ""}
  ' file

(A
    (A1
        (A1a))
    (A2)
    (A3))
(B
    (B1
        (B1a
            (B1aa))))
(C)