代码之家  ›  专栏  ›  技术社区  ›  Matt Howes

单引号中的单引号问题-Bash命令行GNU并行

  •  2
  • Matt Howes  · 技术社区  · 11 年前

    我不熟悉Bash命令行的用法,需要知道在现有单引号中使用单引号的正确语法。

    ls *file.fa | parallel -j4 'perl -pe 's/^>/>{}/' {} >newfile_{}'
    

    我知道GNU并行命令不是特别出名或使用,但我不认为对于需要单引号内的单引号的不同命令,语法会有所不同。命令是更改>至>file.fa(>然后是文件名)位于名为file.fa的文件中,其中{}合并了从ls*file.fa部分导出的文件。

    非常感谢您的帮助

    1 回复  |  直到 11 年前
        1
  •  4
  •   Ole Tange    11 年前

    GNU Parallel中的引用是一门黑色艺术。手册中有一整节专门介绍它: http://www.gnu.org/software/parallel/man.html#QUOTING

    结论: 为了避免处理引用问题,编写一个小脚本或函数(记住导出-f函数)并使用GNU可能会更容易 平行的 称之为。

    在这种情况下,我将编写一个函数:

    fasta_namer() {
      NAME=$1
      perl -pe "s/^>/>$NAME/" "$NAME" >newfile_"$NAME"
    }
    export -t fasta_namer
    ls *file.fa | parallel -j4 fasta_namer {}
    

    FASTA文件名通常不奇怪,但如果它们是(例如包含“”\*&/或其他疯狂字符),那么这可能会解决问题:

    fasta_namer() {
      NAME=$1
      PERLQUOTED=$2
      NEWNAME=$3
      perl -pe "s/^>/>$PERLQUOTED/" "$NAME" >"$NEWNAME"
    }
    export -t fasta_namer
    ls *file.fa | parallel -j4 fasta_namer {} '{=$_=quotemeta($_)=}' {.}.new.fa