BashがJSONをパラメータとして渡すことを主張する

BashがJSONをパラメータとして渡すことを主張する

多くの人が同様の質問をしたことを知っていますが、正しく機能することはできません。

次のファイルがありますDependencies

Accounts
Aggregates
Blog
Configuration
Contacts
Contents
DataTypes
Forms
Geo
Globalization
Media
Modules
Navigation
Podcast
Seo
Social
Taxonomy
Tracking
Vlog

JSON配列文字列に変換するコードは次のとおりです。

DependenciesPath=/$Organization/Common/Dependencies
mapfile -t DependenciesArray < $DependenciesPath
DependenciesArray+=('Infra')
export dependencies=$(echo '%s\n' "${DependenciesArray[@]}" | jq -R . | jq -s .)

それからそれを渡すコードがありますnode.js

node /$Organization/$Repository/LocalizationHelper.js $File $astFile "$dependencies"

問題は、私のファイルLocalizationHelper.jsに次の内容があることです。

[
  "%s\\n Accounts Aggregates Blog Configuration Contacts Contents DataTypes Forms Geo Globalization Media Modules Navigation Podcast Seo Social Taxonomy Tracking Vlog Infra"
]

ご覧のとおり、プロジェクトは互いに分離されておらず、%s\\n最初は重複しています。これが私が望むものです(有効なJSON配列)。

[ "Accounts", "Aggregates", "Blog", ...]

私はここに閉じ込められています。どうすればいいですか?const dependencies = JSON.parse(process.argv[4])私のコードからJavaScript配列に変換したいです。

答え1

jqファイルの変換に直接使用できます。mapfileシェル配列を使用または作成する必要はありません。

jq -Rn '[ inputs, "Infra" ]' </path/to/Dependencies

例:

printf '%s\n' apple banana cherry |
    jq -Rn '[ inputs, "Infra" ]'

出力:

[
  "apple",
  "banana",
  "cherry",
  "Infra" 
]

生(引用符なし)データを読み取るように指示し、-Rパイプの前に入力を読み取らないように指示します。適切な時点で処理するようにオペレータに任せます。jq-njqinputs

フラグを追加して出力を1行に圧縮できます-c

["apple","banana","cherry","Infra"]

答え2

jq一般に、JSON処理に使用するツールであるChris Daviesは、jqこの特定の問題に適用される優れた例を提供しています。彼らの答えに

という別のツールjoのために特別に設計されています。コマンドラインからJSONをビルドする。を使用すると、JSON配列を次の短いシェルコードの文字列joとして使用できます。$deps

deps=$( jo -a <Dependencies )

配列の最後の要素としてanを追加するInfra方法は次のとおりです。

deps=$( jo -a <Dependencies | jo -f - "Infra" )

質問に提供されているデータに基づいて、次のJSON配列を文字列として生成します$deps

["Accounts","Aggregates","Blog","Configuration","Contacts","Contents","DataTypes","Forms","Geo","Globalization","Media","Modules","Navigation","Podcast","Seo","Social","Taxonomy","Tracking","Vlog","Infra"]

美しく印刷された配列を生成するために最後の呼び出しに-p追加されました。jo


また、このツールのいくつかの制限に注意してください。以下はStéphane Chazelasのコメントです。

数字のように見える文字列を数字、空の文字列をnull配列として処理し、[...]ファイル@fileの内容をロードするなどの操作を実行します(例を参照printf '%s\n' 1e002 @/etc/shadow @/dev/watchdog 0xDEADBEEF '' '{}' | jo -a)。任意の文字列にはこの方法では使用できません。

答え3

あなたがヌッシャー:

open dependencies.txt | lines | to json

bash / zshに滞在したい場合は、jqの代わりにnushellを使用することもできます。

nu -c 'open dependencies.txt | lines | to json'

答え4

そしてperl

$ perl -CiI -MJSON::PP -le '
    chomp(@lines = <>);
    print encode_json [@lines, "Infra"]' Dependencies
["Accounts","Aggregates","Blog","Configuration","Contacts","Contents","DataTypes","Forms","Geo","Globalization","Media","Modules","Navigation","Podcast","Seo","Social","Taxonomy","Tracking","Vlog","Infra"]

UTF-8でデコードおよびエンコードされた入力渡すencode_json(byte / latin1モードに維持する必要があるSTDOUT出力層ではありません)UTF-8でエンコードされたJSONを作成します。

または、OOインターフェイスを使用している場合は、次のデコードとエンコードをスキップできます。

perl -MJSON::PP -le '
  chomp(@lines = <>);
  print JSON::PP->new->encode([@lines, "Infra"])' Dependencies

そのまま> 127バイトを渡します。 UTF-8以外の入力はブロックしませんが、その場合はUTF-8以外のJSONを生成します。

ロケールの文字エンコーディングに従って入力をデコードし、UTF-8でエンコードされたJSONを出力するには、次の手順を実行します。

perl -MJSON::PP -Mopen=IN,locale -le '
  chomp(@lines = <>);
  print encode_json [@lines, "Infra"]' Dependencies

ASCII以外の文字が次のように表示されるJSONを生成することもできます\uXXXX(または\uDXXXX\uDXXXXU + FFFF以上の文字については通常どおり)。

perl -MJSON::PP -Mopen=IN,locale -le '
  chomp(@lines = <>);
  print JSON::PP->new->ascii->encode([@lines, "Infra"])' Dependencies

入力にASCII文字しか含まれていない場合は、違いはありませんが(例のように)英語ではなく依存関係名がある場合は、考慮する必要があります。

関連情報