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

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

関連情報