【问题标题】:How to use sed to split a string?如何使用 sed 拆分字符串?
【发布时间】:2020-08-03 07:24:07
【问题描述】:

我是 bash 脚本的新手。我想拆分以下字符串,

chr14:81370042-81371098(+)

进入

chr14 81370042 81371098 +

chr14:81370042-81371098(-)

进入

chr14 81370042 81371098 -

请告诉我如何使用一个适用于这两种情况的命令来执行此操作。

我试过了,cat a.tsv | tr -s ':' '\t' | sed "s/\t[0-9]+.*[0-9]+/[0-9]+\t[0-9]/g",还是不行。

谢谢。

【问题讨论】:

    标签: regex bash shell awk sed


    【解决方案1】:

    这个sed 可能有用:

    sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(+)'
    

    chr14 81370042 81371098 +
    

    否则:

    sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(-)'
    

    chr14 81370042 81371098 -
    

    [^-+_[:alnum:]]+ 匹配任何不是-+_ 和字母数字的字符中的一个或多个。

    【讨论】:

    • 谢谢,这行得通,但如果我也必须同样拆分 chr7:26004607-26028902(-) 怎么办,因为上面删除了 (-)?
    • 但这会导致 chr7 26004607-26028902 - 我希望它是 chr7 26004607 26028902 -
    【解决方案2】:

    使用所示示例进行编写和测试,请您尝试以下操作。

    echo "chr14:81370042-81371098(+)" | awk '{gsub(/:|-|\(|\)/,OFS)} 1'
    

    第二个解决方案:awk中使用字段分隔符。

    echo "chr14:81370042-81371098(+)"  | 
    awk -v FS=':|-|\(|\)' '{
      $1=$1
      sub(/ +$/,"")
    }
    1'
    

    【讨论】:

      【解决方案3】:
      $ sed 's/[():]/ /g; s/-/ /' file
      chr14 81370042 81371098 +
      chr14 81370042 81371098 -
      

      或者如果您不喜欢留下的尾随空白字符:

      $ sed 's/[(:]/ /g; s/)//; s/-/ /' file
      chr14 81370042 81371098 +
      chr14 81370042 81371098 -
      

      【讨论】:

        猜你喜欢
        • 2012-05-16
        • 1970-01-01
        • 2012-02-14
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多