1

私はこのような設定ファイルを持っています:

[sectionOne]
key1_1=value1_1
key1_n=value1_n


#this is a comment
[sectionTwo]
key2_1=value2_1
key2_n=value2_n

;this is a comment also
[SectionThree]
key3_1=value3_1
key3_n=value3_n
[SectionFor]
...

最小限のシェルツールを使用して、これをjsonに変換する必要があります(perl、python、php、sed、awkは利用できません)

必要な出力は次のとおりです。

[
{"sectionOne": { "key1_1": "value1_1","key1_n": "value1_n"} },
{"sectionTwo": { "key2_1": "value2_1","key2_n": "value2_n"} },
{"sectionThree": { "key3_1": "value3_1","key3_n": "value3_n"}}
....
]

私はいくつかの方法/時間を試しましたが、成功しませんでした

前もって感謝します

4

3 に答える 3

1

サンプル入力と目的の出力の間にはいくつかの不一致があるため、確認するのは困難ですが、これは、100% 希望どおりではないにしても、近くて簡単に調整できるはずです。

$ cat file
[sectionOne]
key1_1=value1_1
key1_n=value1_n


#this is a comment
[sectionTwo]
key2_1=value2_1
key2_n=value2_n

;this is a comment also
[SectionThree]
key3_1=value3_1
key3_n=value3_n
$
$ cat tst.awk
BEGIN{
   FS="="
   print "["
}

/^([#;]|[[:space:]]*$)/ {
   next
}

gsub(/[][]/,"") {
   printf "%s{\"%s\": { ", rs, $0
   rs="} },\n"
   fs=""
   next
}

{
   printf "%s\"%s\": \"%s\"", fs, $1, $2
   fs=","
}

END{
   print rs "]"
}
$
$ awk -f tst.awk file
[
{"sectionOne": { "key1_1": "value1_1","key1_n": "value1_n"} },
{"sectionTwo": { "key2_1": "value2_1","key2_n": "value2_n"} },
{"SectionThree": { "key3_1": "value3_1","key3_n": "value3_n"} },
]
于 2012-10-31T19:14:22.793 に答える
1
awk 'BEGIN{ print "[" }
    /^[#;]/{ next }  # Ignore comments
    /^\[/{ gsub( "[][]", "" ); printf "%s{\"%s\": { ", s ? "}},\n" : "", $0; n=0; s=1 }
    /=/ { gsub( "=", "\":\"" ); printf "%c\"%s\" ", n ? "," : "", $0; n=1 }
    END{ print "}}\n]" }
' 
于 2012-10-31T19:14:34.897 に答える
0

を使用したbashのソリューションは次のawkとおりです。

#!/bin/bash

awk -F"=" 'BEGIN{in_section=0; first_field=0; printf "["}
            {
                last=length($1);
                if ( (substr($1,1,1) == "[") && (substr($1,last, last) == "]")) {
                    if (in_section==1) {
                        printf "} },";
                    }
                    section=substr($1, 2, last-2);
                    printf "\n{\"%s\":", section;
                    printf " {";
                    first_field=1;
                    in_section=1;
                } else if ( substr($1, 1, 1) == "#" || substr($1, 1, 1) == ";"){

                } else if ( ($1 != "") && ($2 != "") ) {
                    if (first_field==0) {
                        printf ", ";
                    }
                    printf "\"%s\": \"%s\"", $1, $2;
                    first_field=0;
                }

            }
            END{printf "} }\n]\n"}'
于 2012-10-31T19:21:53.060 に答える