【问题标题】:sed find and replace fastq regexsed 查找并替换 fastq 正则表达式
【发布时间】:2017-10-24 16:36:18
【问题描述】:

我有一个文件,例如

head testSed.fastq
@M01551:51:000000000-BCB7H:1:1101:15800:1330 1:N:0:NGTCACTN+TATCCTCTCTTGAAGA
NGTCACTN
+
#>AAAAF#
@M01551:51:000000000-BCB7H:1:1101:15605:1331 1:N:0:NATCAGCN+TAGATCGCCAAGTTAA
NATCAGCN
+
#>>AA?C#
@M01551:51:000000000-BCB7H:1:1101:15557:1332 1:N:0:NCAGCAGN+TATCTTCTATAAATAT
NCAGCAGN

我正在尝试使用正则表达式将最后一个冒号后面的字符串替换为0(在此示例中为第 1、5、9 行 - 但全局)。

我使用 egrep egrep '[ATGCN]{8}\+[ATGCN]{16}$' testSed.fastq 检查了我的正则表达式,它返回了我期望的所有行。

但是,当我尝试使用sed -i 's/[ATGCN]{8}\+[ATGCN]{16}$/0/g' testSed.fastq 时,原始文件没有改变,也没有发生替换。

我该如何解决这个问题?我的正则表达式不够具体吗?

【问题讨论】:

  • 你需要转义{}或者使用-E/-r
  • 你能详细说明一下吗?
  • @skurp,用户 123 建议 sed -E -i ... 启用 egrep 样式的扩展正则表达式。

标签: regex bash unix sed


【解决方案1】:

你需要一个正则表达式吗?

awk -F: -v OFS=: '/^@/ {$NF = "0"} 1' testfile

这不会就地保存。如果你有 GNU awk,你可以

gawk -F: -v OFS=: -i inplace '...' file

参考:https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html

【讨论】:

  • 注意-i inplace只有4.0+
【解决方案2】:

您的正则表达式的结构是 ERE 而不是 BRE,这是 sed 的默认解释。并非所有 sed 实现都支持 ERE,但您可以在您的环境中检查 man sed 以确定它是否适合您。寻找 -r-E 选项。您可以通过在大括号前加上反斜杠来交替使用边界。

也就是说,与其匹配最后一个字段中的精确文本,为什么不直接查找以冒号开头且后跟没有更多冒号的字符串?以下 RE 同时兼容 BRE 和 ERE。

$ sed '/^@/s/:[^:]*$/:0/' testq
@M01551:51:000000000-BCB7H:1:1101:15800:1330 1:N:0:0
NGTCACTN
+
#>AAAAF#
@M01551:51:000000000-BCB7H:1:1101:15605:1331 1:N:0:0
NATCAGCN
+
#>>AA?C#
@M01551:51:000000000-BCB7H:1:1101:15557:1332 1:N:0:0
NCAGCAGN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2021-12-31
    • 2012-01-26
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多