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