需要帮助找出一个正则表达式来修改一些文件

需要帮助找出一个正则表达式来修改一些文件

我有一些文件需要清理一些名称。

例如:

GCA_940670685.1_Clostridium_sp_chr  3757330
GCA_940677205.1_Clostridium_colinum_chr 2035557
GCA_942548115.1_Aeromicrobium_sp_chr    3463989
GCA_943169635.1_Fenollaria_sp_chr   3260126
GCA_943169825.1_Varibaculum_sp_chr  4423380
GCA_943736995.1_Sporosarcina_sp_chr 3771420

我需要一些像这样的:

GCA_940670685.1 3757330
GCA_940677205.1 2035557
GCA_942548115.1 3463989
GCA_943169635.1 3260126
GCA_943169825.1 4423380
GCA_943736995.1 3771420

我尝试使用:

sed 's/_[A-Za-z]+_//gI' Terrabacteria_chr_lengths.tsv

sed 's/\w+_\w+_chr//gI' Terrabacteria_chr_lengths.tsv

find Results/Lengths/Bacteria -type f -exec sed -i 's/_\w+_\w+_chr//g' {} \;

但似乎什么都没有起作用,我想是由于我的正则表达式技能不佳,例如。\w+\w+_chr。

任何建议都值得感激。谢谢。

保罗

答案1

最大的问题是+在 sed 基本正则表达式(BRE)中不能充当量词 - 您需要使用-E或切换到扩展正则表达式(ERE)模式-r来使用它(或更改+\{1,\}POSIX BRE 版本1)。

除此之外,你似乎想匹配一系列字母字符和下划线在初始下划线之后(但不是以一个下划线结尾)。因此,可以:

sed -E 's/_[A-Za-z_]+//'

或者

sed 's/_[A-Za-z_]\{1,\}//'

需要g修饰符,因为每行只进行一次替换。


1 GNU sed 实际上支持\+作为 BRE 中的量词,但恕我直言,这只会增加混乱。

相关内容