需要在 sed 命令中指定数字

Kum*_*mar 3 linux sed text-processing

我有一个fasta文件,如下所示,

>accessory/4745/24/lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>accessory/95/89.78/lake_sample_pv_strain_LH201_Gene125
TAGTCT
Run Code Online (Sandbox Code Playgroud)

我需要accessory/numericals/numericals/从 fasta 标头中删除字符,所以我使用了以下命令,但它未能达到我的目的。

sed 's/accessory[/][0-9][/][0-9]//g' accessory.fasta
Run Code Online (Sandbox Code Playgroud)

预期的输出是

>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。提前致谢。

ter*_*don 8

您的正则表达式正在查找 " accessory/,然后是一个数字( [0-9]),然后是/",这不会出现在您的文件中。您想搜索一个或多个 numbers,并且您还想允许.哪个不是数字。因此,使用与原始逻辑相同的逻辑,您会想要这样的东西:

$ sed -E 's/accessory[/][0-9.]+[/][0-9.]+[/]//' accessory.fasta
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT
Run Code Online (Sandbox Code Playgroud)

请注意我没有使用g修饰符,因为它在这里没用,因为每行只有一个匹配项。

然而,这是不必要的限制。如果文件如您所示,您只想删除所有内容,直到最后/一行:

$ sed -E 's|>.*/|>|' accessory.fasta 
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT
Run Code Online (Sandbox Code Playgroud)

该s///运营商可以采取任何字符作为分隔符。所以因为我知道我需要匹配/,所以我过去s|||避免需要逃避/.

如果你真的需要像你原来的那样严格,你可以简化为:

$ sed -E 's|accessory/[0-9.]+/[0-9.]+/||' accessory.fasta 
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT
Run Code Online (Sandbox Code Playgroud)