Shell/Bash 스크립트를 사용하여 단어를 추출하는 방법

Shell/Bash 스크립트를 사용하여 단어를 추출하는 방법

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"
]

관련 정보