我有一个文件,如
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
时,原始文件保持不变,不会发生替换。
我该如何解决这个问题?我的正则表达式不够具体吗?
答案 0 :(得分:2)
你需要一个正则表达式吗?
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
答案 1 :(得分:1)
你的正则表达式是一个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