我有一些文件需要清理一些名称。
例如:
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 中的量词,但恕我直言,这只会增加混乱。