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

问题描述 投票:0回答:1

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

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

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

非常感谢任何帮助

regex bash command-line quotes gnu-parallel
1个回答
4
投票

GNU Parallel 中的引用是一门黑术。手册中有一整节专门用于引用

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

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

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
    
© www.soinside.com 2019 - 2024. All rights reserved.