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",
...
}

ファイルサイズを減らすために、ファイル名とファイルパス(最初の2行を無視)を抽出したいと思います。

// 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ここでjqsplit関数を使用することもできます)。

「最初の2つ」エントリをスキップするには、-to_entries[]に置き換えto_entries[2:][]ます。しかし、私が知っている限り、JSONオブジェクトのKey-Valueペアは実際には順序付けされていないため、他の基準に基づいて項目を選択する方が強力です。のような.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

おすすめ記事