次のような文字列があるとしましょう。
[[["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
そうしません。