行的其余部分空间
后转移到一个新行,如果我有以下几点:行的其余部分空间
>AB ABABABA
>AC ACACACA
怎么办我的空间后移的一切到一个新行即
>AB
ABABABABA
>AC
ACACACACA
我曾尝试:
cat file | sed 's/ /\n/g'
cat file | tr ' ' '\n'
但是我得到完全相同的输出。
**更新**
在检查使用更少和纳米的文件时,输出是使用cat不同。该文件包含一些不在cat中显示的终端转义字符,但数量较少。 (这是怎么发生的?)
这是一个可怕的错误发现,并且每个人都已经根据猫的输出发布了更正的答案。所以谢谢你的帮助。 MOD可以关闭这个吗?
看来你需要更换(任何一种)的换行空间
perl -pe 's/\s+/\n/' data.txt
这会在我的测试中产生所需的输出。 -p
设置输入循环(打开文件或使用STDIN
)并将$_
设置为当前行。每次处理后还会打印$_
。
如果有多个空格,每个空格要被替换为\n
,请添加/g
修饰符。
如果有可能更多的是你还可以捕捉模式和替换它们
perl -pe 's/\s+(.*)/\n$1/' data.txt
继在answer by glenn jackman观察和“更紧密”寻找它看来,第一个字上该行需要被复制到下一行。接着上面的修改为
perl -pe 's/^>(\S+)\K\s+/\n$1';
的\K
是positive lookbehind的一种特殊形式,其断言该模式preceeds当前匹配的位置,但它摒弃之前的所有匹配(所以你不必捕捉并复制它们)。你可以找到它in perlre。没有它,>(\S+)
将被消耗,因此它必须被复制回替换部分,如/>$1\n$1/
。
您是否试图将空间前的内容移动到下一行?
正如>A 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
绝对只是一个单一的空间 – brucezepplin
这是一个欺骗sed! –
这确实是'*** ed up sed',我们可能不同意'*代表:-)。重点是什么?它更简单,更高效,更便携,更容易扩展,并以其他方式更好地在awk中做这样的事情。让所有神秘的sed构造死去,坚持它的优点 - 's/x/y /'。 –
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
'sed's// \ n/g'file'应该可以工作 – anubhava
@anubhava至少应该用'tr',至少包含测试数据。不过,有人可能想使用'$'\ n'作为换行符。 – andlrc
奇怪的是 - 我已经试过这个(见问题),它不工作。我完全困惑! – brucezepplin