大括号之间的连接线

大括号之间的连接线

我需要在大括号之间连接可变数量的行,大括号是嵌套的,因此只有以特定前缀模式开头的大括号才需要连接:

header {

category1 (a) {
field1 : value1 ;
field2 : value2 ;
...
fieldn : valuen ;
}

new cat1 (b) {
newfield1 : newvalue1 ;
newfield2 : newvalue2 ;
....
newfieldn : newvaluen ;
}

...

}

类别和字段名称是可变的,末尾的“;”前面可能有也可能没有空格。任何行前面或单词/分隔符等之间都可以有空格或制表符。

输出应如下所示:

header {
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }
}

我使用的是 CentOS,所以 sed/awk/perl 都可用。

谢谢!

答案1

尝试

$ awk '
/^ *$/          {next
                }
/cat.*{/        {while (! /}/)  {getline X
                                 $0 = $0 X
                                }
                }
1
' file
header {
category1 (a) {field1 : value1 ;field2 : value2 ;...fieldn : valuen ;}
new cat1 (b) {newfield1 : newvalue1 ;newfield2 : newvalue2 ;....newfieldn : newvaluen ;}
...
}

答案2

对于多字符 RS 和 RT 的 GNU awk,这将完成中间的部分:

$ awk -v RS='[^\n]+{[^{}]+}' '{$0=RT; $1=$1} RT' file
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }

打印第一行和最后一行就像 head -1 和 tail -1 一样简单:

$ head -1 file; gawk -v RS='[^\n]+{[^{}]+}' '{$0=RT; $1=$1} RT' file; tail -1 file
header {
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }
}

或者如果你关心的话,也可以弄清楚如何在 awk 脚本中做到这一点,这并不是特别难,只是需要比我现在更多的思考!

答案3

这将主要完成您想要的操作,尽管如果省略它们,它不会在值和分号之间添加空格...

假设您的输入位于 file.txt 中:

tr "\n" " " < file.txt | tr "\t" " " | tr -s " " | sed "s/}/}\n/g" | sed "s/header {/header {\n/" | sed "s/^ //g"

1)将现有的所有换行符替换为空格

tr "\n" " "

2)将所有制表符替换为空格

tr "\t" " "

3) 将所有空格替换为单个空格

tr -s " "

4) 将所有右括号替换为右括号后跟换行符

sed "s/}/}\n/g"

5) 在最初的“header {”后添加换行符

sed "s/header {/header {\n/"

6) 删除后续行的前导空格

sed "s/^ //g"

相关内容