Linux

需要在 sed 命令中指定數字

  • January 19, 2021

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

>accessory/4745/24/lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>accessory/95/89.78/lake_sample_pv_strain_LH201_Gene125
TAGTCT

我需要accessory/numericals/numericals/從 fasta 標頭中刪除字元,所以我使用了以下命令,但它未能達到我的目的。

sed 's/accessory[/][0-9][/][0-9]//g' accessory.fasta

預期的輸出是

>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT

請幫我解決這個問題。提前致謝。

您的正則表達式正在查找“ accessory/,然後是一個數字( [0-9]),然後是一個/”,這不會出現在您的文件中。您想搜尋一個或多個數字,並且您還想允許.哪個不是數字。因此,使用與原始邏輯相同的邏輯,您會想要這樣的東西:

$ 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

請注意我沒有使用g修飾符,因為這在這裡沒有用,因為每行只有一個匹配項。

然而,這是不必要的限制。如果文件如您所見,您只想刪除所有內容,直到最後/一行:

$ sed -E 's|>.*/|>|' accessory.fasta 
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT

運算符可以將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

引用自:https://unix.stackexchange.com/questions/629861