sed 替换整数后面的分隔符

sed 替换整数后面的分隔符

给定一个文件名,chrIII:834297-835206:-.miRanda.txt我想生成一个最小的床格式(制表符分隔的数据):

chrIII  834297  835206  -

我很难告诉sed只转换-整数后面的第一个分隔符(即不要弄乱第二次出现的链信息)。我的尝试echo *.miRanda.txt | sed 's/.miRanda.txt//g' | sed 's/:/\t/g; s/[0-9]-/\t/g'是不正确的,如果有人可以提供帮助,我将不胜感激(我怀疑我必须围绕[0-9]某种模式,但我在不知道术语的情况下努力用谷歌搜索这个)。

解决方案并不一定是需求sed

答案1

这是一种方法(使用 GNUsed或任何其他支持的方法-E):

$ echo chrIII:834297-835206:-.miRanda.txt |     
    sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):([^.]+).*/\1\t\2\t\3\t\4/'
chrIII  834297  835206  -

请注意,这假设您永远不能将 a.作为第四个字段(床文件中的名称)。如果这不是一个安全的假设并且您需要使用扩展,您可以这样做:

$ echo chrIII:834297-835206:-.miRanda.txt | 
    sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):(.+)\.miRanda.txt/\1\t\2\t\3\t\4/'
chrIII  834297  835206  -

另请注意,最小床格式根本不需要第四个字段。这是一个有效的床文件:

chrIII  834297  835206

最后,你的方法是几乎在那里,尽管比严格需要的稍微复杂一些。您从开始位置删除了最后一个整数,因为它用制表s/[0-9]-/\1\t/符替换了数字和。-这与您的命令基本上相同,只是稍微调整以解决此问题并删除不必要的g全局运算符:

$ echo chrIII:834297-835206:-.miRanda.txt | 
    sed 's/\.miRanda.txt//' | 
        sed -E 's/:/\t/g; s/([0-9])-/\1\t/'
chrIII  834297  835206  -

我不知道你为什么说这对你来说失败了。

相关内容