regex - 赛德。如何删除与其周围的模式和字符串匹配的行?

标签 regex bash sed

我有一个文件,您要在其中删除按模式匹配的行并删除上方和下方的字符串。

举例:

FFFFIFIBBFFFFFFFFFFFFFBBBBFBBBBFBBBB77<<BBBBBB7B<BBBBBB<B< @HISEQ:102:h9u5badxx:1:1101:13002:2147 1:N:0:CTGT GATCCCCGTCTATCAGATACACGTTACTCAGCTAGTGCGAATGCGAACGCGAAATTTT + FFFFFFFFBBFFFFFFFFFFFFFBFBFFFFFFFFFBFFFBFFFFFBFFFFFFFFFBFB @HISEQ:102:h9u5badxx:1:1101:15368:2194 1:N:0:CTGT + FFIFBFFIFFBBBFFFFFFFBBFFBFFBBBFFFBB7BBBBBBFFFBB700<7770<BBB0<0<BFFBFBFFFFF @HISEQ:102:h9u5badxx:1:1101:19167:2169 1:N:0:CTGT GATCTCATATAGGGCAGCGTGGTCGCGGC

我想删除不包含核苷酸序列的第二个 block 。

最终结果:

`FFFFIFIBBFFFFFFFFFFFFFBBBBFBBBBFBBBB77<<BBBBBB7B<BBBBBB<B<
@HISEQ:102:h9u5badxx:1:1101:13002:2147 1:N:0:CTGT
GATCCCCGTCTATCAGATACACGTTACTCAGCTAGTGCGAATGCGAACGCGAAATTTT
+
FFIFBFFIFFBBBFFFFFFFBBFFBFFBBBFFFBB7BBBBBBFFFBB700<7770<BBB0<0<BFFBFBFFFFF
@HISEQ:102:h9u5badxx:1:1101:19167:2169 1:N:0:CTGT
GATCTCATATAGGGCAGCGTGGTCGCGGC
`

匹配这个 block 的模式

'^.+$(\n)^(@HISEQ).*$(\n)^\+'

适用于 perljavascript,但不适用于 sed

因为 sed 不支持换行。

我找到了解决方案

sed -e ':a;N;$!ba;s/\n/ /' test

但是此代码将换行符替换为空格。如果将我的正则表达式插入此代码:

sed -e ':a;N;$!ba;/^.+$(\n)^(@HISEQ).*$(\n)^\+/d' test

这是行不通的。 你能帮我找到这个问题的解决方案吗?


我太傻了。我误解了文件格式。 输入:

@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA 
+ 
JJJHIIJFIJJJJ=BFFFFFEEEEEEDDDDDDDDDDBD 
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<?6?FAFEC@=C@1AE############### 

如何编辑正则表达式来得到你想要的

输出:

@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<?6?FAFEC@=C@1AE###############

最佳答案

如果我没理解错的话

sed ':loop; N; /\n+/ ! { $ ! b loop }; /\n@HISEQ[^\n]\+\n+/ d' foo.txt

会起作用。这是如下:

:loop                    # in a loop
N                        # fetch more lines
/\n+/ ! { $ ! b loop }   # until one starts with + or is the last line
/\n@HISEQ[^\n]\+\n+/ d   # if the penultimate line of all that begins with @HISEQ,
                         # discard the lot.

最后一个模式利用了这样一个事实,即在找到以 + 开头的第一行后立即对其进行检查,因此它末尾的 \n+ 唯一匹配 block 中最后一行的开头。

关于regex - 赛德。如何删除与其周围的模式和字符串匹配的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27804541/

相关文章:

linux - sed/awk : Aligning words in a file

Bash:如何用定界符分割一行并在新行上打印每个元素?

python - 如何使用正则表达式中的变量在 python 中增加整个单词匹配

linux - shell脚本中的参数处理

xml - 从日志中解析xml的sed命令

bash - 通过 msmtp 运行时 awk 权限被拒绝

linux - BASH - tr grep 结果换行

regex - RegEx需要将数字精确匹配到小数点后两位

javascript - 使用 JavaScript 将字符串中的元音替换为其在字符串中的索引

Python正则表达式找到确切的单词