使用sed或VIM用新行替换空格

时间:2013-12-11 04:07:19

标签: 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 −−−

因此,_at的所有单词都将成为每行的第一个单词。 每一行都包含成对_at和基因术语。

7 个答案:

答案 0 :(得分:7)

在Vim中,我会这样做:

:%s/ /^M/g
:g/_at/j

通过按下control-V(Windows上的control-Q),然后按Enter / Return键来键入^M

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

答案 1 :(得分:2)

惊人但真实:

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 −−−

换句话说,我使用的sed字符串中有一个实际回车符(控制台添加了>):

sed 's/\([^ ]*\) \(.[^ ]* \)/\1 \2\
> /g'

您可以尝试使用其他表达式(现在我假设平衡对,但如果您特别想要匹配第一个字符串末尾的at)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

为您的例子,

sed -e 's/\(_at [0-9a-zA-Z−]*\) /\1\n/g'

答案 4 :(得分:1)

sed 's/\(_at[[:blank:]]\{1,\}[^[:blank:]\{1,\}\)\([[:blank:]]\)/\1\
\2/g' YourFile

这允许任何“空格”作为分隔符并且在一个或多个出现时,在最后一行没有\ n。在_at终止字符串的任何部分之后,这需要1个“单词”,而不是单词的替代(从我这边解释)。

这不能避免2个“_at”写在2个单独的行上(如果有一个丢失/空字的话)

答案 5 :(得分:1)

以下是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 ...

这会打印两个和两个字段。

另一个版本:

awk '{printf $0 FS;getline;print}' RS=" " file

答案 6 :(得分:1)

您可以使用它来查找第一个单词以“_at”

结尾的所有双字对
grep -oP '\S+_at\s+\S+' file

或者,在每个第二个单词之后加上换行符:

tr -s '[:blank:]' '\n' < file | paste -d " " - -