結論
$ less test.txt
{"hoge":"fuga","piyo":"foobar"}
$ less test.txt | sed -r "s/^.*?\"hoge\":\"([^\"]*)\".*$/\1/"
fuga
-
[^A]*
(クラスの否定)をうまく活用する。
やりたかったこと
- 下記のようなjsonでkeyに一致するvalueを抜き出したかった
test.txt
{"hoge":"fuga","piyo":"foobar"}
- しかしsedは最長一致のためこうなる
$ less test.txt | sed -r "s/\"hoge\":\"(.+?)\"/\1/"
{fuga","piyo":"foobar}
- 違う。そうじゃない。
なぜ最初のでうまく行くか
- []でクラス化した文字列の否定で、文字列の最初から辿る
- 指定した文字列ではない文字列をすべてスルー
- 目的の文字列があったらそこでサーチをやめる=最短一致
補足
- 大抵の言語で採用されている正規表現は「やりたかったこと」で記載されている正規表現を使えば同じことができる