ファイル名の一部を抽出しようとしていますが、最初の_以降のすべての内容を抽出したいと思います。動作するソリューションを見つけました。下記をご覧ください。
file=22NGS71294_S191_R1_001.fastq.gz
echo $file
22NGS71294_S191_R1_001.fastq.gz
echo ${file#*[_ ]}
S191_R1_001.fastq.gz
ただし、ワイルドカードを使用すると動作が停止します。
file2=*R1*
echo $file2
22NGS71294_S191_R1_001.fastq.gz
echo ${file2#*[_ ]}
22NGS71294_S191_R1_001.fastq.gz
$ fileと$ file2のechoコマンドがまったく同じ結果を与えるので、これがうまくいかない理由はわかりません。誰かがこの動作を説明できますか?
答え1
sh
, ksh
, bash
( またはzsh
いいえこのglobassign
オプションが設定されている場合)、スカラー割り当てのRHSでファイル名を生成する(別名「globbing」)は発生しません。file2=*R1*
あなたのecho $file2
報酬は22NGS71294_S191_R1_001.fastq.gz
次のとおりです引用しない拡張はこの時点でファイル名の生成の影響を$file2
受けますecho ${file2#*[_ ]}
が、実際には。echo ${'*R1*'#*[_ ]}
echo *R1*
いつ二重引用符が必要ですか?。
ksh/bash/zshで利用可能大量に割り当て - 多くの場合、*R1*
複数のファイル名が生成される可能性があるため、これを行う必要があります。たとえば、Bashでは次のようになります。
shopt -s nullglob
file2=(*R1*)
echo "${file2[@]#*_}"