シェルワンライナー160本ノック問題36
問題36 かっこの対をチェック
問題のファイルは
https://github.com/shellgei/shellgei160
からダウンロードできる。
*1*2(((((((る))))))(((((し)))))(ゅ)(((げ)))))((((((い))) という文字列からかっこが対になっているものを抜き出してメッセージを読む問題だった。再帰的にやるのだろうなと見当はついたが具体的にワンライナーへ落とし込むのはできなかった。ちょっとしたことの積み重ねでできなくなってしまう。
解答例は
cat message.txt | sed 's/)(/)\n(/g' | grep -P '^(\(\g<1>\)|[^()]+)$' | tr -d '()' | paste - -sd ''
となる。まず)(となっているところに改行を入れて整理する。そうすると後の処理がやりやすくなる。次に grep で再帰的にかっこの対を指定する。^ や $ を忘れると余計なものまでくっついてくるので注意。あとはかっこを除去して横に並べれば完成である。