我有一个数据文件如下。
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
现在正在运作。
答案 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
如果你不习惯正则表达式,这个可能比其他解决方案更容易理解!