我试图编写一个sed
脚本来将缩进转换为等效的括号。
例如,括号应放在此
中A
A1
A1a
A2
B
B1
这样看起来像这样
(A
(A1
(A1a))
(A2))
(B
(B1))
或者这个(一旦括号被放置,空格就不再重要了):
( A ( A1 ( A1a ) ) ( A2 ) )
( B ( B1 ) )
假设为了简单起见
原则似乎很简单:
然而,教导sed
一行的变化取决于另一条线的外观对我来说并不简单。
答案 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)