많은 사람들이 비슷한 질문을 했다는 것을 알고 있지만 제대로 작동할 수는 없습니다.
다음과 같은 파일이 있습니다 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
플래그를 추가하여 출력을 한 줄로 압축할 수 있습니다 -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 문자만 포함되어 있으면 아무런 차이가 없지만(예제에서처럼) 영어가 아닌 종속성 이름이 있을 수 있는 경우 고려해야 할 사항이 될 수 있습니다.