Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 跨行查找字符串并替换为空_Regex_Macos_Sed - Fatal编程技术网

Regex 跨行查找字符串并替换为空

Regex 跨行查找字符串并替换为空,regex,macos,sed,Regex,Macos,Sed,我有一些“fastq”格式的DNA序列文件(基本上只是文本文件),如下所示: @Sample_1 ACTGACTGACTGACTGACTGACTGACTG ACTGACTGACTGACTGACTGACTGACTG + BBBBBBBBBBBBEEEEEEEEEEEEEEEE EHHHHKKKKKKKKKKKKKKNQQTTTTTT @ + @ + @Sample_4 ACTGACTGACTGACTGACTGACTGACTG ACTGACTGACTGACTGACTGACTGACTG + BBBBB

我有一些“fastq”格式的DNA序列文件(基本上只是文本文件),如下所示:

@Sample_1
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
@
+
@
+
@Sample_4
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
我的最终目标是将这些文件转换成“FASTA”格式文件,但要做到这一点,我需要清除中间的两个空序列。 编辑

所需的输出如下所示:

@Sample_1
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
@Sample_4
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
我试过的所有专用软件(Biopython、独立程序、其他人发布的perl脚本)都在空序列中崩溃。这实际上只是搜索字符串
@\n+
并将其替换为空的问题。我在谷歌上搜索了这篇文章,读了好几篇文章,用sed尝试了大约一百万个选项,但都没能找到答案。以下是一些不起作用的东西:

sed s/'@'/,/'+'// test.fastq > test.fasta
sed s/'@,+'// test.fastq > test.fasta
如有任何见解,将不胜感激

另外,我有一台Mac电脑。

试试:

sed "/^[@+]*$/d" test.fastq > test.fasta
指示sed删除匹配行(即不打印)

^
$
分别表示“字符串开始”和“字符串结束”,即行必须完全匹配

因此,上面的命令基本上说:

打印不包含
@
+
的所有行,并将结果写入
test.fasta

编辑:对不起,我稍微误解了这个问题。如果只想删除连续行对,如

@
+
然后需要执行多行搜索和替换

虽然这可以通过
sed
完成,但使用
perl
脚本可能更容易:

perl -0pe 's/^@\n\+\n//gm' test.fastq > test.fasta
  • -0
    选项将Perl转换为“文件slurp”模式,在此模式下,Perl一次读取整个输入文件(而不是逐行读取)。这将启用多行搜索和替换
  • -pe
    选项允许您运行Perl代码(本例中为模式匹配和替换)并显示命令行的输出
  • ^@\n\+\n
    是要匹配的模式,我们将用零替换它(即删除)
  • /gm
    使替换成为多行和全局的

您也可以将
-i
作为第一个参数传递给
perl
,以内联编辑文件。

这可能不是世界上最优雅的解决方案,但您可以使用tr将
\n
替换为
null
字符并返回

cat test.fastq | tr '\n' '\0' | sed 's/@\x0+\x0//g' | tr '\0' '\n' > test.fasta
试试这个:

sed '/^@$/{N;/\n+$/d}' file
当找到
@
时,下一行将用
N
追加到模式空间。
如果在下一行中找到
$
,则
d
命令将删除这两行。

请在代码标记中发布预期输出,然后告知我们。
^[+@]+$
带有
gm
修饰符。如果您还需要删除空白
^[+@]+$\s*
您可以使用
grep-Ev'^@[:blank:]*$文件
,该文件已关闭。唯一的问题是,我需要保留其他只有
+
的行(例如Sample1和Sample4中的行)。请查看我的编辑:)如果您在问题中明确编写了
test.fasta
的所需内容,我会更清楚一些。这太棒了,谢谢!也谢谢你非常清楚的解释。这有助于我学到更多,希望下次我能自己完成。真的很感激!