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