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

플래그를 추가하여 출력을 한 줄로 압축할 수 있습니다 -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 문자만 포함되어 있으면 아무런 차이가 없지만(예제에서처럼) 영어가 아닌 종속성 이름이 있을 수 있는 경우 고려해야 할 사항이 될 수 있습니다.

관련 정보