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

Single quotes within single quotes issue - Bash command line GNU parallel

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

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

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

非常感谢任何帮助

在 GNU Parallel 中引用是一种魔法。手册中有一整节专门介绍它:http://www.gnu.org/software/parallel/man.html#QUOTING

Conclusion: To avoid dealing with the quoting problems it may be easier just to write a small script or a function (remember to export -f the function) and have GNU parallel call that.

在这种情况下我会写一个函数:

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

FASTA 文件名通常并不奇怪,但如果它们很奇怪(例如包含 ' " \ * & / 或其他奇怪的字符)那么这可能会解决它:

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