0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

sed や grep での正規表現で 'or' ができない?

Posted at

あらすじ

ある 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行を表示」とかもありました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?