bash - 处理文件名中的特殊字符

时间:2016-08-05 16:41:33

标签: bash

我正在使用bash shell并正在使用人类参考基因组GRCh38。我有一个目录中的文件列表,每个染色体一个文件。现在我需要搜索文件名列表。看似微不足道,但文件名不方便有特殊字符。例如:

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
…

我很难搜索特定的文件名(来自脚本),因为特别是“?”字符似乎被“\ t”取代。例如:

ls -1 ../GRCh38_chromosomes/ | perl -ne ' 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
…
当我尝试搜索

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

应输出:

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

但反而找不到任何东西。我也试过awk同样的问题,我想知道他们为什么在GRCh38的染色体名称中加入特殊字符?有任何想法如何处理这些问题角色?

1 个答案:

答案 0 :(得分:2)

您的诊断已关闭。问题是ls用问号替换了实际的制表符,但只有在其标准输出是终端时才会替换。

这是you should not use ls in scripts at all的众多原因之一。

你似乎只是在寻找

printf '%s\n' ../"HLA-DRB1*15:01:02"*

其中printf '%s\n'可以简单地用echo替换,但我想你想要在for循环中使用这个通配符表达式或者作为文件名参数一个完全不同的命令。

引号会导致第一个星号按字面解释;引号外的第二个星号是一个匹配任何字符串的通配符。 (正则表达式星号,又名Kleene星,仍然具有不同的语义,并且与自身不匹配 - 相反,它指定了前一个字符或分组表达式的zeor或更多重复。)