从 sed 捕获组中删除模式匹配正则表达式

从 sed 捕获组中删除模式匹配正则表达式

我正在尝试从文件中的某些字符串中删除所有“_(一个数字)”实例。因此tig00000003_1应该成为tig00000003我的测试文件如下所示:

##sequence-region tig00000001_732 1 630
tig00000003_1 Name=tig00000003_1;

我尝试过 sed -E 's/(tig[0-9]{8}\_[0-9]{1})/ \1(tig[0-9]{8}) /' my_test.txt,结果如下:

##sequence-region  tig00000001_7(tig[0-9]{8}) 32 1 630
 tig00000003_1(tig[0-9]{8}) Name=tig00000003_1;

这就是我想要的:

##sequence-region tig00000001_732 1 630
tig00000003 Name=tig00000003;

我怎样才能删除捕获组中匹配的模式,或者只保留捕获组内的匹配?

答案1

您可以简单地将非注释行上的“_(一个数字)”替换为空,如下所示:

sed '/^[^#]/ s/\_[0-9]//g' your_file

其工作方式如下:

  • 与注释不匹配的行被标识为以 ( ^) 任何非 # 符号 ( [^#])开头的行
  • 然后在这些行上,每当在该行中找到该模式时,用任何下划线 + 数字 ( ) 替换_[0-9]为空( )(//)g

答案2

你很接近了。使用括号括住“tig”数字

sed -E '/^#/n; s/(tig[0-9]{8})\_[0-9]/\1/g' my_test.txt
# ...............^^^^^^^^^^^^^........^^

相关内容