多くの人が同様の質問をしたことを知っていますが、正しく機能することはできません。
次のファイルがあります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
-n
jq
inputs
フラグを追加して出力を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\uDXXXX
U + FFFF以上の文字については通常どおり)。
perl -MJSON::PP -Mopen=IN,locale -le '
chomp(@lines = <>);
print JSON::PP->new->ascii->encode([@lines, "Infra"])' Dependencies
入力にASCII文字しか含まれていない場合は、違いはありませんが(例のように)英語ではなく依存関係名がある場合は、考慮する必要があります。