regex - 删除换行符 (\n) 但排除具有特定正则表达式的行?

标签 regex bash sed awk

经过大量搜索,我发现了几种使用 sed 或 tr 删除换行符的方法

sed ':a;N;$!ba;s/\n//g'

tr -d '\n'

但是,我找不到从特定行中排除操作的方法。我了解到可以使用“!”在 sed 中作为从后续操作中排除地址的方法,但我无法弄清楚如何将它合并到上面的 sed 命令中。这是我要解决的问题的示例。

我有一个格式如下的文件:

>sequence_ID_1
atcgatcgggatc
aatgacttcattg
gagaccgaga
>sequence_ID_2
gatccatggacgt
ttaacgcgatgac
atactaggatcag
at

我想要以这种方式格式化文件:

>sequence_ID_1
atcgatcgggatcaatgacttcattggagaccgaga
>sequence_ID_2
gatccatggacgtttaacgcgatgacatactaggatcagat

我一直专注于尝试排除包含“>”字符的行,因为这是唯一存在于具有“>”字符的行上的常量正则表达式(注意:sequence_ID_n 对于前面的每个条目都是唯一的通过“>”,因此不能依赖于正则表达式匹配)。

我试过这个:

sed ':a;N;$!ba;/^>/!s/\n//g' file.txt > file2.txt

它运行时没有产生错误,但输出文件与原始文件相同。

也许我不能用 sed 做到这一点?也许我错误地处理了这个问题?我是否应该尝试定义一系列要操作的行(即仅以“>”开头的行之间的行)?

我是基本文本操作的新手,所以非常感谢任何建议!

最佳答案

这个 awk 应该可以工作:

$ awk '/^>/{print (NR==1)?$0:"\n"$0;next}{printf "%s", $0}END{print ""}' file
>sequence_ID_1
atcgatcgggatcaatgacttcattggagaccgaga
>sequence_ID_2
gatccatggacgtttaacgcgatgacatactaggatcagat

关于regex - 删除换行符 (\n) 但排除具有特定正则表达式的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702065/

相关文章:

javascript替换多个字符

bash - 为什么 docker 伪 tty 在通过管道传输到其他命令时会损坏输出?

linux - Bash 终端和颜色输出

linux - Unix/Linux Bash 脚本 : sed doesn't respect spaces

linux - 使用 grep/sed/awk 其他在 unix 中过滤文件?

c++ - 将句子拆分为包含撇号的单词

正则表达式匹配行直到第一个空行

linux - xargs echo `echo {} | sed ' s/pattern/replace/'` 不起作用,但每个循环都有效

javascript - 正则表达式匹配用大括号包裹的单词

bash - 管道胶带有时会跳过任务 : cross-product error