单引号内的单引号--Bash命令行GNU并行

时间:2015-02-11 15:43:14

标签: regex bash command-line quotes gnu-parallel

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

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

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

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

引用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