あらすじ
ある JSON データから、"transcript": ...
と"confidence": ...
とある行のみを抽出しようとしたときのこと・・・。
(ちなみに IBM Speech To Text の結果の JSON データ)
指定の文字列が存在する行を標準出力してくれるgrep
コマンドに、「transcript
またはconfidence
という文字列がある」と命令をしてやればいいわけだ。
正規表現で 'or' をするには|
を挟んで文字列を記述すれば良いので、transcript|confidence
と書いてやれば良いわけだ。
・・・が?
grep "transcript|confidence"
# (結果無し)
あれれ〜?おっかしいぞ〜?
原因
正規表現の書き方は何ら問題は無く、|
は拡張正規表現であったというのが原因です。
grep
で拡張正規表現を使えるようにするには-E
オプションが必要です。
grep -E "transcript|confidence" input.json
# "transcript": "テキスト",
# "confidence": 0.56
(レスポンスされる JSON データにインデントが入っているので、結果の文字列左にスペースが入っています。)
正しく書いているハズなのに、正規表現が思った動きをしない?と思ったら、とりあえず-E
をつけてみたら解決することがあるかもしれません。
ちなみに、+
(直前の文字が 1回以上繰り返されている) も拡張正規表現のようです。
以下余談
JSON データ数が 150個近くあったので、目視で手作業でコピペしてという選択肢は初めから外れていました。
Python に JSON の標準ライブラリ使ってやりくりして、という形でも良かったのですが、ただ抽出するだけと単純な動作だけだったので sh コマンドで片付けました。
sh シェルスクリプトなら、for ループで書いても 5行くらいで書き終えられるから楽なんや・・・。
ちなみに、オプション探しにgrep
のヘルプを改めて読んでみたとき、「一致した行の前後 n行を表示」とかもありました。