括弧を結ぶ線

括弧を結ぶ線

中かっこの間に可変数の行を連結する必要があります。入れ子にされ、特定のプレフィックスパターンで始まる中括弧だけを連結します。

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)すべてのスペースを1つのスペースに置き換える

tr -s " "

4)すべての右角かっこを右角かっこと改行文字で置き換える

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

5)最初の「ヘッダ{」の後に改行文字を追加します。

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

6) 次の行から先行スペースを削除します。

sed "s/^ //g"

関連情報