我正在使用sed替换14个不同的缩写,例如CA_23456,CB_scaffold34532,...在文件中使用“正确”的名称,并将其全部放在一行上。
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 expression#1,char 168:unterminated address regex。我已经查看了各种网络论坛上类似问题的答案并尝试了各种各样的事情(在每一行使用's /.../.../',留下';'out,....)但我不能让它工作。我做错了什么?
答案 0 :(得分: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/
答案 1 :(得分: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"