【问题标题】:Single quotes within single quotes issue - Bash command line GNU parallel单引号内的单引号问题 - Bash 命令行 GNU 并行
【发布时间】:2015-04-12 01:33:57
【问题描述】:

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

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

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

非常感谢任何帮助

【问题讨论】:

  • 试试'perl -pe "s/^>/>{}/" {} >newfile_{}'
  • 单引号不嵌套。开始你的sed 命令的单引号实际上是关闭以'perl 开头的字符串,等等。要么像@AvinashRaj 建议的那样交换引号,要么使用'\'' 来“转义”内部单引号。
  • 非常感谢 - 用一对单引号代替双引号工作
  • 还值得注意的是,现代 GNU xargs(带有-P)具有足够的功能,通常使 GNU 并行的混乱变得不必要。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2020-04-06
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2014-01-24
    相关资源
    最近更新 更多