Linux 使用sed或VIM用新线替换空间

Linux 使用sed或VIM用新线替换空间,linux,unix,sed,vi,Linux,Unix,Sed,Vi,我有以下数据 1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−− 使用sed或VIM编辑器,如何将其更改为 1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−− 所以所有在处有\u的单

我有以下数据

1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−−
使用
sed
或VIM编辑器,如何将其更改为

1455931_at Chrna3 
1420468_at Asb17 
1445520_at −−− 
1436717_x_at Hbb−y 
1431788_at Fabp12 
1458975_at −−−
所以所有在处有
\u的单词都将是每行的第一个。

每行由成对的at和基因项组成。

使用sed:
s/\n/g;s/\u at\n/\u at/g
可能会有一个更优雅的解决方案,但这一个就可以了。

令人惊讶但却是正确的:

sed 's/\([^ ]*\) \(.[^ ]* \)/\1 \2\
> /g' <<<"1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−−"
1455931_at Chrna3 
1420468_at Asb17 
1445520_at −−− 
1436717_x_at Hbb−y 
1431788_at Fabp12 
1458975_at −−−

您可以尝试一下其他表达式(现在我假设是平衡对,但是如果您特别想匹配第一个字符串末尾处的
,您可以这样做)。

在Vim中,我会这样做:

:%s/ /^M/g
:g/_at/j
其中,
^M
是通过按control-V(Windows上的control-Q)然后按Enter/Return键键入的

这假设令牌之间存在单个空格;正如@Floris所建议的,您可以使用
s/\+/^M/g
将多个连续空格转换为一个换行符。或者您可以使用
s/\v\s+/^M/g
对任何连续的空格(包括制表符和文本空格字符)执行相同的操作。

例如

sed -e 's/\(_at [0-9a-zA-Z−]*\) /\1\n/g'
这允许任何“空格”作为分隔符,并且在一次或多次出现时,在最后一行上不\n。这将在字符串的任何部分(在
处以
\u结尾)后取1个“单词”,而不是单词的变化(从我的角度解释)


这并不能避免在两个单独的行上写入两个“_at”(如果缺少/空单词)

以下是一个
awk
解决方案:

awk '{for (i=1;i<=NF;i+=2) print $i,$(i+1)}' file
1455931_at Chrna3
1420468_at Asb17
1445520_at ...
1436717_x_at Hbb.y
1431788_at Fabp12
1458975_at ...

您可以使用它查找第一个单词以“\u at”结尾的所有2字对

或者,在每两个单词后面加一个换行符:

tr -s '[:blank:]' '\n' < file | paste -d " " - -
tr-s'[:blank:]['\n'
可以在VIM中使用吗?我在VIM可视模式下尝试了这一点,但失败了:'在bash或其他POSIX shell中,您也可以利用POSIX字符串并将其键入为
$'…\\\n/g'
@MarkReed-换行符有三个反斜杠?你能解释一下吗?请?@Floris-
$'\\\n'
由shell转换为与您的答案相同的顺序:反斜杠后跟换行符
sed
无法区分两者之间的区别。在POSIX字符串中,
$'…'
\\
变成一个文字反斜杠,
\n
变成一个换行符,所以把它们放在一起,你可以得到反斜杠+换行符的
\\\n
。看起来很优雅,但在我的
sed
(Mac OS)版本中
\n
无法识别。只要只有一个空格,就可以使用。第一个命令可能需要
%s/\+/^M/g
?它处理额外的空白。
awk '{for (i=1;i<=NF;i+=2) print $i,$(i+1)}' file
1455931_at Chrna3
1420468_at Asb17
1445520_at ...
1436717_x_at Hbb.y
1431788_at Fabp12
1458975_at ...
awk '{printf $0 FS;getline;print}' RS=" " file
grep -oP '\S+_at\s+\S+' file
tr -s '[:blank:]' '\n' < file | paste -d " " - -