bash的子字符串



我正在尝试用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

相关内容

  • 没有找到相关文章

最新更新