如何使用 sed 删除特定字符后的数字?

How can I remove numbers after a specific character with sed?

我需要修改一个 .fasta 文件,如下所示:

>Contig_1;2
AGATC...
>Contig_2;345
AaGGC...
>Contig_3;22
GGAGA...

并将其转换为:

>Contig_1
AGATC...
>Contig_2
AaGGC...
>Contig_3
GGAGA...

我尝试执行以下操作,但没有按预期工作。

sed -i 's/;*\n/\n/g' file.fasta

有人可以给我一些建议吗?谢谢!

你可以使用

sed -i 's/;[^;]*$//' file.fasta

参见 online demo:

s='>Contig_1;2
AGATC...
>Contig_2;345
AaGGC...
>Contig_3;22
GGAGA...'
sed 's/;[^;]*$//' <<< "$s"

输出:

>Contig_1
AGATC...
>Contig_2
AaGGC...
>Contig_3
GGAGA...

请注意 sed 不会将换行符放入模式 space 中(因为您使用的是 GNU sed,您可以使用 [=15= 强制它这样做],但这里没有必要),并且您不能在 sed 命令中将换行符与 \n 匹配。

;[^;]*$ 模式匹配

  • ; - 一个 semi-colon
  • [^;]* - ; 以外的任何零个或多个字符(如果您需要确保匹配数字,请替换为 [0-9]*[[:digit:]]*
  • $ - 字符串结尾。

请注意,此处不需要 g 标志,因为此命令需要每行执行一次替换。

第一个解决方案: 你可以用awk让它变得非常简单。用你展示的示例编写,在 GNU awk.

awk -F';' '/^>/{NF=1} 1'  Input_file

解释: 简单的解释就是,将所有行的字段分隔符设置为;。在主程序检查条件中,如果行从 > 开始,则将 NF(字段数)设置为 1,这将在第一次出现 ;.

之前保留值

第二个解决方案 你想寻找所有类型的线(无论是否以 > 开头)并且你在第一次出现 ; 之前需要值,然后尝试以下解决方案:

awk -F';' '/;/{NF=1} 1' Input_file

我们可以结合使用cat命令和awk来显示输出。

cat filename | awk -F ';' '{print }'

这里';'将作为文件分隔符,然后屏幕上只会显示第一个字段。