Bash 将行的其余部分移到空格后的换行符

Bash 将行的其余部分移到空格后的换行符,bash,perl,unix,sed,tr,Bash,Perl,Unix,Sed,Tr,如果我有以下资料: >AB ABABABA >AC ACACACA 如何在空格后将所有内容转换为换行符,即 >AB ABABABABA >AC ACACACACA 我试过: cat file | sed 's/ /\n/g' cat file | tr ' ' '\n' 然而,我得到了完全相同的输出 **更新** 使用less和nano检查文件后,输出与使用cat不同。该文件包含一些终端转义字符,这些字符不显示在cat中,但显示在less中。(这是怎么发生的?) 这

如果我有以下资料:

>AB ABABABA
>AC ACACACA
如何在空格后将所有内容转换为换行符,即

>AB
ABABABABA
>AC
ACACACACA
我试过:

cat file | sed 's/ /\n/g'
cat file | tr ' ' '\n'
然而,我得到了完全相同的输出

**更新**

使用less和nano检查文件后,输出与使用cat不同。该文件包含一些终端转义字符,这些字符不显示在cat中,但显示在less中。(这是怎么发生的?)


这是一个很难发现的错误,实际上每个人都根据cat的输出发布了正确的答案。谢谢你的帮助。mods可以关闭这一行吗?

您是否也在尝试将内容从空间之前移动到下一行

正如在
>中一样,BC成为:

>A
ABC
然后可以像这样使用sed:

$ sed 'h;s/^>\([^ ]*\) /\1/;x;s/ .*/ /;G' file
>AB 
ABABABABA
>AC 
ACACACACA
细分:

h;                                # Copy pattern space to hold buffer
  s/^>\([^ ]*\) /\1/;             # Convert >A BC to ABC 
                     x;           # eXchange hold buffer and pattern space
                       s/ .*/ /;  # Remove everything after, but including the
                                  # first space: >A BC -> >A
                                G # Append hold buffer to pattern space

您是否也在尝试将内容从空格之前移动到下一行

正如在
>中一样,BC成为:

>A
ABC
然后可以像这样使用sed:

$ sed 'h;s/^>\([^ ]*\) /\1/;x;s/ .*/ /;G' file
>AB 
ABABABABA
>AC 
ACACACACA
细分:

h;                                # Copy pattern space to hold buffer
  s/^>\([^ ]*\) /\1/;             # Convert >A BC to ABC 
                     x;           # eXchange hold buffer and pattern space
                       s/ .*/ /;  # Remove everything after, but including the
                                  # first space: >A BC -> >A
                                G # Append hold buffer to pattern space

似乎你需要用换行符替换(任何类型的)空格

perl -pe 's/\s+/\n/' data.txt
这将在我的测试中生成所需的输出。
-p
设置循环输入(打开文件或使用
STDIN
)并将
$\uu
设置为当前行。它还可以在每次处理后打印
$\uuu

如果有多个空格,每个空格都要替换为
\n
,请添加
/g
修饰符

如果还有更多的工作要做,您还可以捕获模式并替换它们

perl -pe 's/\s+(.*)/\n$1/' data.txt

根据中的观察并“更仔细地观察”,似乎需要将行中的第一个单词复制到下一行。然后将上述内容修改为

perl -pe 's/^>(\S+)\K\s+/\n$1';

\K
是的一种特殊形式,它断言模式在当前匹配位置之前,但它会丢弃所有以前的匹配(因此您不必捕获和复制它们)。你可以找到它。如果没有它,
(\S+)
将被消耗,因此必须将其复制回替换部件中,因为
/>$1\n$1/

似乎需要用换行符替换(任何类型的)空间

perl -pe 's/\s+/\n/' data.txt
这将在我的测试中生成所需的输出。
-p
设置循环输入(打开文件或使用
STDIN
)并将
$\uu
设置为当前行。它还可以在每次处理后打印
$\uuu

如果有多个空格,每个空格都要替换为
\n
,请添加
/g
修饰符

如果还有更多的工作要做,您还可以捕获模式并替换它们

perl -pe 's/\s+(.*)/\n$1/' data.txt

根据中的观察并“更仔细地观察”,似乎需要将行中的第一个单词复制到下一行。然后将上述内容修改为

perl -pe 's/^>(\S+)\K\s+/\n$1';

\K
是的一种特殊形式,它断言模式在当前匹配位置之前,但它会丢弃所有以前的匹配(因此您不必捕获和复制它们)。你可以找到它。如果没有它,
>(\S+)
将被消耗,因此必须将其复制回替换零件中,因为
/>$1\n$1/
sed仅用于单个行上的简单替换,仅此而已。对于任何其他您应该使用awk的内容,例如:

$ awk '{print $1 ORS substr($1,2) $2}' file
>AB
ABABABABA
>AC
ACACACACA

sed是对单个行的简单替换,仅此而已。对于任何其他您应该使用awk的内容,例如:

$ awk '{print $1 ORS substr($1,2) $2}' file
>AB
ABABABABA
>AC
ACACACACA

仔细观察,您似乎想重复下一行中的第一个单词:转换这个

>foo bar
>baz qux
进入这个

>foo
foobar
>baz
bazqux
如果这是真的,你可以这样做

sed -r 's/^>([^ ]+) />\1\n\1/' file  # or
perl -pe 's/^>(\S+) />$1\n$1/' file

仔细观察,您似乎想重复下一行中的第一个单词:转换这个

>foo bar
>baz qux
进入这个

>foo
foobar
>baz
bazqux
如果这是真的,你可以这样做

sed -r 's/^>([^ ]+) />\1\n\1/' file  # or
perl -pe 's/^>(\S+) />$1\n$1/' file


sed的//\n/g”文件
应work@anubhava至少在测试数据的情况下,
tr
。有人可能想用
$'\n'
来表示文字换行符;不行。我完全糊涂了!你有标签吗,还是真的有空间。试试sed的//xxx/“
@brucezepplin,“它不工作”是最没用的问题描述——你需要向我们展示它是如何工作的?您的实际输出是什么?
sed的//\n/g'文件
应该work@anubhava至少在测试数据的情况下,
tr
。有人可能想用
$'\n'
来表示文字换行符;不行。我完全糊涂了!你有标签吗,还是真的有空间。试试sed的//xxx/“
@brucezepplin,“它不工作”是最没用的问题描述——你需要向我们展示它是如何工作的?您的实际输出是什么?确切地说,只有一个空格确实是
***ed up sed
,我们可能不同意
*
s代表什么:-)。重点是什么?在awk中,这样做更简单、更高效、更可移植、更容易扩展,而且在其他方面都更好。让所有神秘的sed结构消失,并坚持它的好处-
s/x/y/
@EdMorton AFAIK POSIX sed没有在替换零件中严格指定
\n
。用空格代替换行符。请告诉我如何使用awk,因为您的答案没有显示出来。@EdMorton上述sed将
>abc def
更改为
>abc abcdef
,其中空格为换行符。我用一个问题回答了这个问题,因为OP的预期产出就是他们想要的。嗯,他就是这样。他巧妙地用相同的两个字符的序列来伪装他的输出,使我们很难看到他在用它们做什么。我不确定这是一个很好的方式来获得答案,但你去吧。好的,我已经更新了我的答案。确切地说,只有一个空格确实是
***ed up sed
,我们可能对
*
表示的内容有不同意见:-)。重点是什么?它更简单、更高效、更便携、更简单