JSON 파일이 있습니다.
...
...
"dependencies": {
// more lines
},
"exports": {
"./package.json": "./package.json",
"./.DS_Store": "./.DS_Store",
"./accordions/AccordionDefault.svelte": "./accordions/AccordionDefault.svelte",
".": "./index.js",
"./modals/modalStores": "./modals/modalStores.js",
// more lines
"./tabs/DefaultTabs.svelte": "./tabs/DefaultTabs.svelte",
"./tabs/InteractiveTabs.svelte": "./tabs/InteractiveTabs.svelte",
"./tabs/PillTabs.svelte": "./tabs/PillTabs.svelte"
},
"svelte": "./index.js"
}
다음을 사용하여 모든 내보내기를 추출할 수 있습니다 jq
.
cat './node_modules/module_name/package.json'| jq '.exports'
{
"./package.json": "./package.json",
"./.DS_Store": "./.DS_Store",
"./accordions/AccordionDefault.svelte": "./accordions/AccordionDefault.svelte",
"./accordions/AccordionItem.svelte": "./accordions/AccordionItem.svelte",
"./alerts/Alert.svelte": "./alerts/Alert.svelte",
...
}
파일 크기를 줄이기 위해 파일 이름과 파일 경로(처음 두 줄 무시)를 추출하고 싶습니다.
// using my_command ls to overwrite the output to my_file
my_command ls
// outputting the my_file
cat my_file
AccordionDefault ./accordions/AccordionDefault.svelte
AccordionItem ./accordions/AccordionItem.svelte
...
Shell/Bash 스크립트를 어떻게 사용하나요?
답변1
"파일 이름"이 객체에 적용되는 basename NAME EXT
키 와 같은 것을 의미한다고 가정합니다 exports
.
$ jq -r '.exports | to_entries[] |
{ name: ((.key / "/")[-1] / ".svelte")[0], path: .value } | [ .name, .path ] | @tsv
' ./node_modules/module_name/package.json
package.json ./package.json
.DS_Store ./.DS_Store
AccordionDefault ./accordions/AccordionDefault.svelte
DefaultTabs ./tabs/DefaultTabs.svelte
InteractiveTabs ./tabs/InteractiveTabs.svelte
PillTabs ./tabs/PillTabs.svelte
이는 문자열 "division"을 사용하여 키를 분할한 /
다음 다시 분할합니다 ( .svelte
여기서 jq split
함수를 사용할 수도 있음).
"처음 두 개" 항목을 건너뛰려면 - to_entries[]
로 바꾸 to_entries[2:][]
십시오. 하지만 제가 아는 한 JSON 개체의 키-값 쌍은 실제로 순서가 지정되어 있지 않으므로 다른 기준에 따라 항목을 선택하는 것이 더 강력합니다. 와 같은 .key | endswith(".svelte")
:
$ jq -r '.exports | to_entries[] | select(.key | endswith(".svelte")) |
{ name: ((.key / "/")[-1] / ".svelte")[0], path: .value } | [ .name, .path ] | @tsv
' package.json
AccordionDefault ./accordions/AccordionDefault.svelte
DefaultTabs ./tabs/DefaultTabs.svelte
InteractiveTabs ./tabs/InteractiveTabs.svelte
PillTabs ./tabs/PillTabs.svelte
답변2
(/.*/.*:)
다음은 jq에서 제공하는 다른 줄만 처리하도록 하위 디렉터리 또는 2개의 슬래시 집합이 포함된 줄을 찾습니다 .
jq '.exports' ./node_modules/module_name/package.json|awk '/\/.*\/.*:/{
gsub(/"/,"",$0)
gsub(/,$/,"",$0)
nf=split ($0,array,":")
ni=split (array[1],subarray,"/")
print subarray[ni],array[2]
}'>my_file
제공되는 출력은 다음과 같습니다.
AccordionDefault.svelte ./accordions/AccordionDefault.svelte
DefaultTabs.svelte ./tabs/DefaultTabs.svelte
InteractiveTabs.svelte ./tabs/InteractiveTabs.svelte
PillTabs.svelte ./tabs/PillTabs.svelte
화타이
PS, 요청한 대로 다른 패턴을 추출하려면 현재 패턴을 /\/.*\/.*:/
원하는 패턴으로 변경하면 됩니다. svelte의 경우 /svelte/
전체 단어를 찾으려면 `/<svelte>/와 같은 것을 사용해야 합니다. 괄호는 정규식을 단어의 시작과 끝으로 나타냅니다. 이 경우 "esveltex", "esvelte", "sveltetc"와 같은 항목은 검색 문자열이 포함되어 있어도 검색어가 아니기 때문에 표시되지 않습니다. 단어 단어의 시작도 아니고 단어의 끝도 아닙니다.
테스트 후:
jq '.exports' ./node_modules/module_name/package.json|awk '/\<svelte\>/{
gsub(/"/,"",$0)
gsub(/,$/,"",$0)
nf=split ($0,array,":")
ni=split (array[1],subarray,"/")
print subarray[ni],array[2]
}'
AccordionDefault.svelte ./accordions/AccordionDefault.svelte
DefaultTabs.svelte ./tabs/DefaultTabs.svelte
InteractiveTabs.svelte ./tabs/InteractiveTabs.svelte
PillTabs.svelte ./tabs/PillTabs.svelte
화타이
답변3
이를 수행하기 위한 더 나은 도구는 jmespath의 약자인 jp입니다. 모든 배포 저장소를 사용할 수 있는 것은 아니지만 여기에서 얻을 수 있습니다.https://jmespath.org/.
해결책:
$ cat minimal.json
{
"x": {
"./package.json": "./package.json",
"./.DS_Store": "./.DS_Store",
"./accordions/AccordionDefault.svelte": "./accordions/AccordionDefault.svelte",
"./accordions/AccordionItem.svelte": "./accordions/AccordionItem.svelte",
"./alerts/Alert.svelte": "./alerts/Alert.svelte"
}
}
$ cat minimal.json | jp "x.values(@)"
[
"./accordions/AccordionItem.svelte",
"./alerts/Alert.svelte",
"./package.json",
"./.DS_Store",
"./accordions/AccordionDefault.svelte"
]