我正在尝试用bash子字符串许多字符串。然而,尽管前缀被正确删除,但后缀没有被删除。
字符串之一:
lcl|MK087647.1_cds_QHD46953.1_7_[gene=rpl2]_[protein=ribosomal_protein_L2]_[exception=RNA_editing]_[protein_id=QHD46953.1]_[location=complement(71768..73444)]_[gbkey=CDS]
期望输出:
MK087647.1_cds_QHD46953.1_7_[gene=rpl2]_[protein=ribosomal_protein_L2]
的代码for row in $colonna2; do tmp=${row#*lcl|}
colonna2_newname=${tmp%exception=*} echo $colonna2_newname; done
输出MK087647.1_cds_QHD46953.1_7_[gene=rpl2]_[protein=ribosomal_protein_L2]_[exception=RNA_editing]_[protein_id=QHD46953.1]_[location=complement(71768..73444)]_[gbkey=CDS]
猜猜为什么后缀没有被删除?我的语法有错误吗?
Thanks in advance
你的变量替换基本正确;似乎代码的主要问题是在定义colonna2_newname
变量后没有换行或分号。
您还需要将colonna2_newname
变量的定义从${tmp%exception=*}
更改为${tmp%_[exception=*}
。
for row in $colonna2
do
tmp="${row#*lcl|}"
colonna2_newname="${tmp%exception=*}"
echo "$colonna2_newname"
done
# output:
# MK087647.1_cds_QHD46953.1_7_[gene=rpl2]_[protein=ribosomal_protein_L2]
现在关于for
循环:如果$colonna2
变量中的任何一行都有空格,for
将在每个空格之后将该行分割成单独的字符串。for
循环更适合与数组和全局文件名/路径名一起使用。while read
循环更适合用于以下文本行:
while IFS=$'n' read -r row
do
tmp="${row#*lcl|}"
colonna2_newname="${tmp%exception=*}"
echo "$colonna2_newname"
done <<< $colonna2