当符号 (_) 在字符串中多次出现时,仅删除特定符号后面的最后一位数字

当符号 (_) 在字符串中多次出现时,仅删除特定符号后面的最后一位数字

我在文本文件中有一个字符串列表:

AY498934.1_cds_AAS79865.1_1_1
AY498934.1_cds_AAS79865.1_1_2
AY498934.1_cds_AAS79865.1_1_3

我想删除最后一个“_”之后的所有内容。

预期成绩:

AY498934.1_cds_AAS79865.1_1
AY498934.1_cds_AAS79865.1_1
AY498934.1_cds_AAS79865.1_1

答案1

sed 's/_[^_]*$//' < file

替换后跟除( ) 之外的_0 个或多个 ( *) 字符,后跟行尾_[^_]$没有什么

答案2

这是另一种方法:

sed -nr 's/(.*)_.*/\1/p' file

贪婪地匹配(匹配的最长字符串)直到_(称为 \1)的所有字符,然后是该行的其余部分,并将其替换为组 \1。

如果没有 -r 参数,反向引用(如 \1)将无法工作。

执行所有 sed 命令后,选项 -n 会关闭模式空间中所有内容的常规打印。

cat file
AY498934.1_cds_AAS79865.1_1_1
AY498934.1_cds_AAS79865.1_1_2
AY498934.1_cds_AAS79865.1_1_3


sed -nr 's/(.*)_.*/\1/p' file
AY498934.1_cds_AAS79865.1_1
AY498934.1_cds_AAS79865.1_1
AY498934.1_cds_AAS79865.1_1

相关内容