【问题标题】:Sed regex between known word and unknown integer已知单词和未知整数之间的 Sed 正则表达式
【发布时间】:2017-08-15 02:31:10
【问题描述】:

我无法获得解决此问题所需的正则表达式,因此请向 SO 向导寻求帮助!

给定:

LOCUS       NODE_96_length_17326_cov_8.76428_ID_1>17327 bp   DNA linear
LOCUS       NODE_97_length_17208_cov_6.56803_ID_1>17208 bp   DNA linear
LOCUS       NODE_98_length_17111_cov_6.60638_ID_1>17111 bp   DNA linear
LOCUS       NODE_99_length_17092_cov_6.7682_ID_19717092 bp   DNA linear
LOCUS       NODE_9_length_59921_cov_8.04963_ID_1759921 bp   DNA linear

我需要替换NODE 和同一字符串末尾的数字序列之间的字符串。数字前面的字符(例如,在第 1 行中,17327)可以显示为 >_。所以基本上我需要替换从NODE 到最后一个>_ 的所有内容,或者匹配到一个未知长度的多位整数。

目前为止我做过的最好的事情是:

sed 's/\(NODE.*\)\(>|_\)/newstring/'

但我知道这行不通。

只是为了清楚说明,这将是所需的输出。

LOCUS       newstring 17327 bp   DNA linear
LOCUS       newstring 17208 bp   DNA linear
LOCUS       newstring 17111 bp   DNA linear
LOCUS       newstring 19717092 bp   DNA linear
LOCUS       newstring 1759921 bp   DNA linear

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    您不需要使用任何组,因为您没有使用任何反向引用。您可以使用:

    sed 's/NODE[^[:blank:]]*[_>]/newstring /' file
    
    LOCUS       newstring 17327 bp   DNA linear
    LOCUS       newstring 17208 bp   DNA linear
    LOCUS       newstring 17111 bp   DNA linear
    LOCUS       newstring 19717092 bp   DNA linear
    LOCUS       newstring 1759921 bp   DNA linear
    

    【讨论】:

    • 我唯一建议的是使用[^[:blank:]]* 而不是.*,以防下划线或尖括号出现在该行的后面。
    • 非常感谢,我以前没有遇到过空白,那么在这种情况下,正则表达式到底在寻找什么?
    • @JoeHealey:POSIX 字符类[[:blank:]] 匹配空格或制表符,而[[:space:]] 匹配空格或制表符或换行符。
    【解决方案2】:

    我会这样做:

    \b(NODE.*\D)\d+\s
    

    单词边界,单词 NODE,直到不是数字的任何东西,然后是一个或多个数字,然后是一个空白字符。 Demo

    Sed 可能需要单词边界为\<(单词开头)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多