2015-04-23 102 views
2

我使用sed替換14個不同的縮寫,如CA_23456,CB_scaffold34532,...以及文件中的「正確」名稱,它將所有縮寫放在一行中。多條線路上的sed命令不起作用

acc=$1 

sed -e 's/CA_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_arizonica/;s/CB_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_bakeri/;s/CM_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_macrocarpa/;s/CS_[A-Z]*[a-z]*[0-9]*/Cupressus_sempervirens/;s/CT_[A-Z]*[a-z]*[0-9]*/Cupressus_torulosa/;s/JD_[A-Z]*[a-z]*[0-9]*/Juniperus_drupacea/;s/JF_[A-Z]*[a-z]*[0-9]*/Juniperus_flaccida/;s/JI_[A-Z]*[a-z]*[0-9]*/Juniperus_indica/;s/JP_[A-Z]*[a-z]*[0-9]*/Juniperus_phoenicea/;s/JX_[A-Z]*[a-z]*[0-9]*/Juniperus_procera/;s/JS_[A-Z]*[a-z]*[0-9]*/Juniperus_scopulorum/;s/MD_[A-Z]*[a-z]*[0-9]*/Microbiota_decussata/;s/XN_[A-Z]*[a-z]*[0-9]*/Xanthocyparis_nootkatensis/;s/XV_[A-Z]*[a-z]*[0-9]*/Xanthocyparis_vietnamensis/' ${acc}.nex > ${acc}_replaced.nex 

爲了使其更具可讀性,我想有超過使用多行命令分裂「\」(不是所有的替代品都顯示爲簡潔起見)

acc=$1 

sed -e 's/CA_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_arizonica/;\ 
s/CB_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_bakeri/;\ 
s/CM_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_macrocarpa/'\ 
${acc}.nex > ${acc}_replaced.nex 

不過,我得到一個錯誤消息:sed:-e表達式#1,字符168:未終止的地址正則表達式。我已經查看了各種webforums上的類似問題的答案,並嘗試了各種各樣的東西(在每一行使用'/.../.../',離開';'出來......),但是我不能讓它工作。我究竟做錯了什麼?

回答

2

刪除逃脫換行符的\。 (他們實際上並沒有這樣做,他們被sed解釋爲錯誤的語法)。不過我建議把它放到一個文件並運行它像這樣:

sed -f script.sed input 

其中script.sed看起來是這樣的:

s/CA_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_arizonica/ 
s/CB_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_bakeri/ 
s/CM_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_macrocarpa/ 
2

從sed的代碼刪除反斜槓。

在帶單引號的shell字符串中,不需要反斜槓來轉義換行符,也不會因爲它們未被解析爲轉義字符而被刪除。這會導致sed將它們視爲其代碼的一部分,然後在命令在下一個換行符(類似於\,/home/, !d)結束之前,預計會找到一個地址正則表達式,其格式與/不同。這個地址的正則表達式沒有出現(也沒有相關的命令),所以sed抱怨無效的代碼。

除此之外:當您使用換行符終止命令時,sed代碼中的分號不再是必需的,涉及shell變量的任何內容都應引用以避免在空格時分裂。

總之:

sed -e 's/CA_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_arizonica/ 
     s/CB_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_bakeri/ 
     s/CM_[A-Z]*[a-z]*[0-9]*/Hesperocyparis_macrocarpa/' \ 
    "${acc}.nex" > "${acc}_replaced.nex" 
+0

我刪除了反斜槓,但現在終端凍結 – Markus

+0

猜測:只有那些經過單引號的字符串應該被刪除。另外,你必須在字符串和文件名'$ {acc} .nex'之間加一個空格(順便說一句,你可能需要用雙引號括起來),否則文件名將被認爲是sed代碼。我以應該工作的命令的形式編輯。 – Wintermute

+0

優秀,解決了問題!非常感謝您的幫助。 – Markus