【问题标题】:Finding and replacing a numeric string between colons, before a space, using sed?使用 sed 在冒号之间、空格之前查找和替换数字字符串?
【发布时间】:2015-09-03 11:30:31
【问题描述】:

我正在尝试将 fastq 文件中的所有坐标信息更改为零。我的输入文件由以下重复的 4 行结构中的数百万个条目组成:

@HWI-SV007:140:C173GACXX:6:2215:16030:89299 1:N:0:CAGATC
GATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAG  
+              
@@@FFFDFHGGDHIIHGIJJJJJJJJJJJGIJJJJJJJIIIDHGHIGIJJIIIJJIJ

我想以通用方式将第一行 16030:89299 中的两个数字字符串替换为零,这样冒号之间、空格之前的任何数字字符串都会被替换。我希望输出如下所示,将整个文件中的两个字符串全局替换为零:

@HWI-SV007:140:C173GACXX:6:2215:0:0 1:N:0:CAGATC
GATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAGATTACAG  
+              
@@@FFFDFHGGDHIIHGIJJJJJJJJJJJGIJJJJJJJIIIDHGHIGIJJIIIJJIJ

我正在尝试使用以下 sed:

sed 's/:^[0-9]+$:^[0-9]+$\s/:0:0 /g' 

但是,这并不像预期的那样。

【问题讨论】:

  • 我不知道 SED,但 ^ 不意味着字符串的开头吗?同样$ 结束?再次不知道 SED 我想你会想要:[0-9]+?:
  • 一定要sed吗?

标签: regex sed


【解决方案1】:

我认为您需要使用sed -r 选项。 此外,^ 匹配行首,$ 匹配行尾。 因此,这是适用于您的示例的命令行。

sed  -r 's/:[0-9]+:[0-9]+\s/:0:0 /g'

【讨论】:

  • $ 匹配字符串的结尾,也可以是多行。 \n 匹配行尾,不是吗?
【解决方案2】:

一些替代品

awk -F ":" 'BEGIN{ OFS = ":" }{ if ( NF > 1 ) {$6 = 0; sub( /^[0-9]*/, 0, $7)}; print $0 }' YourFile

使用由:分隔的列

sed 's/^\(\([^:]*:\)\{5\}\)[^[:blank:]]*/\10:0/' YourFile

使用由: 分隔的5个第一个元素作为分隔符

为你的 sed

sed 's/:[0-9]+:[0-9]+\(\s\)/:0:0\1/' 
  • ^$是相对于整个字符串而不是当前单词
  • 保留原始空间而不是替换为空格的选项(多个或其他类似 \t 的情况)
  • g 不需要(最好不要在这里使用),因为通常每行只出现 1 次
  • 您需要确保该模式在其他地方是不可能的(前一个数字后面不能有空格),因为它是一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2014-09-05
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多