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
,我们可能对*
表示的内容有不同意见:-)。重点是什么?它更简单、更高效、更便携、更简单