删除每行的第一个字符并使用Vim追加

时间:2013-04-22 04:29:03

标签: regex vim

我有一个数据文件如下。

1,14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065
1,13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050
1,13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185
1,14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480
1,13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735

使用vim,我想从每一行中重新获得1并将它们追加到最后。结果文件如下所示:

14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065,1
13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050,1
13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185,1
14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480,1
13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735,1

我一直在寻找一种优雅的方式来做到这一点。

其实我尝试过像

:%s/$/,/g 

然后

:%s/$/^./g

但我无法让它发挥作用。

编辑:嗯,实际上我在我的问题中犯了一个错误。在数据文件中,第一个字符并不总是1,它们是1,2和3的混合。因此,从这些问题的所有答案中,我想出了解决方案 -

:%s/^\([1-3]\),\(.*\)/\2,\1/g

现在正在运作。

5 个答案:

答案 0 :(得分:4)

正则表达式,不关心您使用的是哪个数字,数字或分隔符。也就是说,这适用于同时以1作为第一个数字的行,或114

:%s/\([0-9]*\)\(.\)\(.*\)/\3\2\1/

<强>解释

:%s//           - Substitute every line (%)
\(<something>\) - Extract and store to \n
[0-9]*          - A number 0 or more times
.               - Every char, in this case,
.*              - Every char 0 or more times
\3\2\1          - Replace what is captured with \(\)

所以:1 , <the rest>分别切换为\1\2\3,重新排序。

答案 1 :(得分:4)

:%s/^1,//
:%s/$/,1/

可能有点简单易懂。

答案 2 :(得分:1)

:%s/^1,\(.*\)/\1,1/

这将替换文件中的每一行。 \1替换了(.*)

捕获的所有内容

答案 3 :(得分:1)

:%s/1,\(.*$\)/\1,1/gc

.........................

答案 4 :(得分:1)

您也可以使用宏来解决这个问题。首先,考虑如何从一行的开头删除1,并将其追加到最后:

0 go the the start of the line
df, delete everything to and including the first ,
A,<ESC> append a comma to the end of the line
p paste the thing you deleted with df,
x delete the trailing comma

因此,总结一下,以下内容将转换一行:

0df,A,<ESC>px

现在,如果你想对所有行应用这组修改,你首先需要记录它们:

qj start recording into the 'j' register
0df,A,<ESC>px convert a single line
j go to the next line
q stop recording

最后,您可以随时使用@j执行宏,或使用99@j转换整个文件(如果您的行数超过99,则使用大于99的数字)。

以下是完整版本:

qj0df,A,<ESC>pxjq99@j

如果你不习惯正则表达式,这个可能比其他解决方案更容易理解!