すべての括弧を削除し、入れ子になった括弧のみを削除する方法はありますか?

すべての括弧を削除し、入れ子になった括弧のみを削除する方法はありますか?

次のような文字列があるとしましょう。

[[["q", "0"], "R"], "L"], ["q", [["1", "["], "]"]], [["q", ["2", "L"]], "R"], ["q", ["3", ["R", "L"]]]

ネストされた括弧をすべて削除したいと思います。

["q", "0", "R", "L"], ["q", "1", "[", "]"], ["q", "2", "L", "R"], ["q", "3", "R", "L"]

sedスタックを押したり、破ったり、カウンターを増やしたり減らしたりする方法でこれを行うアルゴリズムを書く方法を理解していますがawk

ベストアンサー1

bracket.awk:

BEGIN{quote=1}
{
    for(i=1;i<=length;i++){
        ch=substr($0,i,1)
        pr=1
        if(ch=="\""){quote=!quote}
        else if(ch=="[" && quote){brk++;pr=brk<2}
        else if(ch=="]" && quote){brk--;pr=brk<1}
        if(pr){printf "%s",ch}
    }
    print ""
}
$ awk -f bracket.awk file
["q", "0", "R", "L"], ["q", "1", "[", "]"], ["q", "2", "L", "R"], ["q", "3", "R", "L"]

その背後に隠れたアイデア:

初期化quote=1.ファイルを文字単位で読み込みます。参照が見つかるたびにquote変数は反転されます(裏面1になり、0その逆も同様です)。

quoteその後、カウンタに基づいて括弧は1に設定されている場合にのみ計算され、超えた括弧は印刷されませんbrk

このprint ""文は改行文字を追加するだけで、上記の文はprintfそうしません。

おすすめ記事