1行のテキストで正規表現の後に続く文字列を見つける方法は?

1行のテキストで正規表現の後に続く文字列を見つける方法は?

非常に長いJSONデータ行を含むテキストファイルがあり、特定のフィールドの値を抽出する必要があります。最も簡単な方法はjqorを使用することですgrep -o。ただし、会社のコンピュータにあるためインストールできず、jq私たちが使用しているSolarisバージョンにはgrepそのオプションはありません-o。現在、次のコマンドを使用しています。

cat json.file   |
    tr "," "\n" |
    awk '/customfield_10701/ { print $0 }' |
    tr '"' "\n" |
    awk 'NR==4'

上記の方法はうまく機能しますが、複雑すぎてエレガントな解決策が必要であるという感じを消すことはできません。

json.file:

... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...

現在のコマンドで次のようになります。

Some Branch

(それが私が欲しいものです)。

答え1

探しているデータに文字がないことを確認し、"ファイルに "customfield_10701"エントリを含む行が1つしかない場合

sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p'

例えば、

$ cat x
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
$ sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p' x
Some Branch

答え2

カンマを改行文字に変換するために使用する必要はありませんtr。それから戻ってきました。awk入力レコード区切り記号()としてカンマを使用できますRS

awk -F':' -v RS=',' '/customfield_10701/ { gsub(/"/,"",$2); print $2 }' json.file

gsub()"フィールド2から二重引用符(存在する場合)を削除するために使用されます。

gsub()必要に応じて、次を使用して先行スペースと末尾のスペースとタブを削除することもできます。

awk -F':' -v RS=',' '/customfield_10701/ {
    gsub(/"|^[[:blank:]]+|[[:blank:]]+$/,"",$2);
    print $2
}' json.file

RSが変更された場合、出力レコード区切り文字(ORS)は自動的には変更されず、設定しない限り(たとえばを使用して-v ORS=',')デフォルト値(改行)のままになります。

答え3

次のテストは私にとって効果的でした。bash 3内蔵正規表現エンジン外部プログラムも必要ありません。

json='"jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj"'

regex_hint=customfield_10701

[[ $json =~ $regex_hint\":\"(.+)\", ]] && printf '%s\n' "${BASH_REMATCH[1]}" 

印刷:一部支店

「()」の間の正規表現は「グループ1キャプチャ」であり、「$ {BASH_REMATCH」に格納されます。1} "

Bashにはサポート機能が組み込まれています。POSIX拡張正規表現よく知られているよりもPerl互換正規表現

関連情報