正規表現の一致に基づいてフォーマットされていないファイルから文字列を抽出する方法

正規表現の一致に基づいてフォーマットされていないファイルから文字列を抽出する方法

正規表現の一致を探して、次の数値文字列を抽出する必要があるSQLクエリから返されたフォーマットされていないファイルがあります。数字は2つの二重引用符で囲まれています。行ごとに複数の一致が発生する可能性があります。ファイルには無視する必要がある他の特殊文字があります。サンプルファイルは次のとおりです。

{ "_id" : "66941672632817171654", "title" : "Some Name (Central)", "stationNameAssoc" : [ { "stationId" : "6248915749115539177", "stationName" : "Default" } ] }
{ "_id" : "4455677484649934117", "title" : "Some Name (Mountain)", "stationNameAssoc" : [ { "stationId" : "7597999415247634177", "stationName" : "Default" } ] }

ここでは、「stationId」の後に引用符を除いて数字を抽出したいです(例:7597999415247634177)。 awkやbashを使ってどうすればいいですか?ありがとう

答え1

jsonというJsonツールを使用します(https://github.com/trentm/json)

$ json -ga 'stationNameAssoc.[0].stationId' < input
6248915749115539177
7597999415247634177

または段階的に使用してください。

cat input | json -ga 'stationNameAssoc' | json -ga stationId

マニュアルは次の場所にあります。http://trentm.com/json/


インストールされていない場合:

install node
and sudo npm install -g json

答え2

別のJSONパーサーソリューションを使用してください。jq:

$ jq -r '.stationNameAssoc[0].stationId' data.json
6248915749115539177
7597999415247634177

stationIdこれは単に各配列の最初の(唯一の)配列項目項目の値を取得しますstationNameAssoc

答え3

awk -F\" '{for(i=1;i<=NF;i++)if($i~/Id/){print $(i+2);next}}' input.txt

関連情報