2016-08-05 7 views
0

私はbashシェルを使用しており、人間参照ゲノムGRCh38で作業しています。私は、ディレクトリ内のファイルのリストを持っています。各ファイルは、各染色体ごとに1つのファイルです。今度はファイル名のリストを検索する必要があります。簡単ですが、ファイル名には特殊文字が付いています。例:bash - ファイル名に特殊文字を扱う

ls -1 ../GRCh38_chromosomes/ 

は、ディレクトリの内容を出力します

… 
HLA-DRB1*13:01:01?HLA00797_13935_bp.fa 
HLA-DRB1*13:02:01?HLA00798_13941_bp.fa 
HLA-DRB1*14:05:01?HLA00837_13933_bp.fa 
HLA-DRB1*14:54:01?HLA02371_13936_bp.fa 
HLA-DRB1*15:01:01:01?HLA00865_11080_bp.fa 
HLA-DRB1*15:01:01:02?HLA03453_11571_bp.fa 
… 

イムが困難な特定の文字に置き換えられますように思われるので、(スクリプトをwithingから)特定のファイル名を探し、「?」は、 "\ t"例:

ls -1 ../GRCh38_chromosomes/ | perl -ne ' print $_; ' 

私は同じ出力を期待するが、代わりに取得する:私は、このようなどの出力すべき

ls -1 ../GRCh38_chromosomes/ | perl -ne ' if ($_ =~ /^\QHLA-DRB1*15:01:01:02?\E/) { print $_; } ' 

などの検索をしようとすると、

… 
HLA-DRB1*13:01:01 HLA00797_13935_bp.fa 
HLA-DRB1*13:02:01 HLA00798_13941_bp.fa 
HLA-DRB1*14:05:01 HLA00837_13933_bp.fa 
HLA-DRB1*14:54:01 HLA02371_13936_bp.fa 
HLA-DRB1*15:01:01:01 HLA00865_11080_bp.fa 
HLA-DRB1*15:01:01:02 HLA03453_11571_bp.fa 
… 

これは私に頭痛を引き起こしている。

HLA-DRB1*15:01:01:02?HLA03453_11571_bp.fa 

代わりに何も見つけません。私は同じ問題をawkでも試してみましたが、なぜGRCh38の染色体名に特殊文字を入れるのだろうと思っていますか?どのようにこれらの問題の文字に対処するためのアイデア?

+0

per per?私はperl 5.16.3を持っていて、この問題を複製することはできません – SaintHax

+0

私は5.22.1を持っていますが、awkと同じ動作を見つける – nak3c

+0

あなたはawkコードを与えていないので、調べることはありません。 lsの '-1'を取り除く必要はありません。 lsをパイプに送ると、lsは常に1つの列形式になります。結果が得られない唯一の方法は、 'ls'や' ls -1'の代わりに 'ls -l'をタイプすることです。 – SaintHax

答えて

2

診断がオフです。問題は、lsが実際のタブ文字を疑問符で置き換えることですが、その標準出力が端末である場合のみです。

これは多くの理由の1つですyou should not use ls in scripts at allあなたは

printf '%s\n'は、単に echoに置き換えることができるが、私はあなたが実際に forループまたはファイルとしてこのワイルドカード表現を使用したいと思うでしょうラインの下の推測
printf '%s\n' ../"HLA-DRB1*15:01:02"* 

のために簡単に探しているように見える

完全に異なるコマンドに対する名前引数。

引用符により、最初のアスタリスクが文字通り解釈されます。引用符の外側にある2番目のアスタリスクは、任意の文字列に一致するワイルドカードです。 (正規表現のアスタリスク、別名Kleeneの星は、まだ別のセマンティクスを持ち、それ自体は一致しません - 前の文字またはグループ化された式のzeor以上の繰り返しを指定します)

+0

提案をお寄せいただきありがとうございます。例えば:find ../GRCh38_chromosomes/ -name "HLA-DRB1 * 15:01:02?" * – nak3c

+0

とにかく、私がしたいと思っているようです – nak3c

関連する問題