2015-02-11 39 views
2

我是Bash命令行使用的新手,需要知道在現有單引號內使用單引號的正確語法。單引號內的單引號問題 - Bash命令行GNU並行

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

我知道GNU並行命令不是特別好已知的或使用的,但我不認爲語法將是一個不同的命令,需要單引號單引號的不同。該命令是在名爲file.fa的文件內將>更改爲> file.fa(>然後是文件名),其中{}合併了從ls * file.fa節點傳送的文件。

非常感謝任何幫助

+0

嘗試' '的perl -pe 「S/^> /> {} /」{}> newfile中_ {}''[使用單引號回聲在bash]的 – 2015-02-11 15:44:45

+0

可能重複(HTTP ://stackoverflow.com/questions/25608503/using-single-quotes-with-echo-in-b灰) – Biffen 2015-02-11 15:46:31

+5

單引號不嵌套。開始執行'sed'命令的單引號實際上是關閉以''perl'開始的字符串等。或者使用@AvinashRaj建議的交換引號或使用'''''來「轉義」內部單引號。 – 2015-02-11 15:47:07

回答

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