2015-11-13 63 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