Linux 在SED中连接带条件的换行符

Linux 在SED中连接带条件的换行符,linux,bash,unix,sed,Linux,Bash,Unix,Sed,我有如下数据: > sq1 foofoofoobar foofoofoo > sq2 quxquxquxbar quxquxquxbar quxx > sq3 foofoofoobar foofoofoo > sq4 foofoofoobar foofoo 我想在“>sqi”标题的基础上连接线作为截止线, i、 e.屈服: foofoofoobarfoofoofoo quxquxquxbarquxquxquxbarquxx foofoofoobarfoofoofoo f

我有如下数据:

> sq1
foofoofoobar
foofoofoo
> sq2
quxquxquxbar
quxquxquxbar
quxx
> sq3
foofoofoobar
foofoofoo
> sq4
foofoofoobar
foofoo
我想在“>sqi”标题的基础上连接线作为截止线, i、 e.屈服:

foofoofoobarfoofoofoo
quxquxquxbarquxquxquxbarquxx
foofoofoobarfoofoofoo
foofoofoobarfoofoo
我尝试使用此
sed
,但失败:

sed '/^S/d;N;s/\n/\t/' 

正确的方法是什么?

您正在测试行首的大写字母“s”。您应该测试大于字符:

sed '/^>/d;N;s/\n/\t/'

编辑:我忽略了一个事实,即标题之间的行数可变。这就是我到目前为止所做的:

sed  -n '/^>/{x; p; d}; /^>/!H; x; s/\n/\t/; h; $p'
不幸的是,这会在标题中留下:

> sq1    foofoofoobar    foofoofoo
> sq2    quxquxquxbar    quxquxquxbar    quxx
> sq3    foofoofoobar    foofoofoo
> sq4    foofoofoobar    foofoo
如果从Bash提示符执行此操作,则可能必须先执行
set+H
,这样就不会因为感叹号而受到历史扩展干扰

Edit2:删除标题的修订版:

sed  -n '1{x;d};/^>/{x; p; d}; H; x; s/\n/\t/; s/^>.*\t//; h; $p'

您正在测试该行开头的大写字母“S”。您应该测试大于字符:

sed '/^>/d;N;s/\n/\t/'

编辑:我忽略了一个事实,即标题之间的行数可变。这就是我到目前为止所做的:

sed  -n '/^>/{x; p; d}; /^>/!H; x; s/\n/\t/; h; $p'
不幸的是,这会在标题中留下:

> sq1    foofoofoobar    foofoofoo
> sq2    quxquxquxbar    quxquxquxbar    quxx
> sq3    foofoofoobar    foofoofoo
> sq4    foofoofoobar    foofoo
如果从Bash提示符执行此操作,则可能必须先执行
set+H
,这样就不会因为感叹号而受到历史扩展干扰

Edit2:删除标题的修订版:

sed  -n '1{x;d};/^>/{x; p; d}; H; x; s/\n/\t/; s/^>.*\t//; h; $p'

原始问题的bash解决方案(即不带“标题”):

#/bin/bash
text=[]
i=0

exec原始问题的bash解决方案(即不带“标题”):

#/bin/bash
text=[]
i=0

exec我在sed中找不到一个简单的方法。不管怎样,你只要改变一下就行了 RS变量和剪切换行符:

awk -v RS='> sq[0-9]' 'NR>1{gsub(/\n/,"");print}' file

我找不到一个简单的方法在sed中实现它。不管怎样,你只要改变一下就行了 RS变量和剪切换行符:

awk -v RS='> sq[0-9]' 'NR>1{gsub(/\n/,"");print}' file

@DW:您的代码片段似乎不起作用。我得到了“foooobartfooofooo\n quxquxquxquxbar\n quxxt>sq3\n fooobartfooo\n fooobartfooo”@DW:你的代码片段似乎不起作用。我得到了“fooooobartfooooo\n quxquxquxquxbar\n quxxt>sq3\n fooobartfooo\n fooobartfooo”