Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー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再帰的にかっこの対を指定する。^ や $ を忘れると余計なものまでくっついてくるので注意。あとはかっこを除去して横に並べれば完成である。

*1:し)))((((い))))(xぇ

*2: