2015-11-13 61 views
0

我正在尝试编写sed脚本将缩进转换为等效的括号。将缩进转换为括号

例如,括号内应放置在此

A 
    A1 
     A1a 
    A2 

B 
    B1 

,使得它看起来像这样

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

(B 
    (B1)) 

或也许这(一旦括号放在空格不再重要) :

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

假设为了简化该

  1. 只有一个令牌在每一行,
  2. 压痕发生的标签,

原理看起来非常简单:

  1. 令牌如果压痕深度之前加一个左括号高于前一行;
  2. 计算当前行多于下一行的制表符的数量,加1并在令牌后放置多个右括号。

但是,教sed一条线的改变取决于另一条线的外观对我来说似乎并不简单。

+0

@Cyrus感谢,固定。 – user66554

+0

@Cyrus nope。我可能应该通过从第一个中删除换行符创建第二个示例,而不是从头开始输入。 – user66554

回答

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) 
+0

好的。虽然它不应该在空行上放置括号(我不好意思把它放在例子中)。 – user66554