2

我有一个数据文件如下。

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

它现在正在工作。

4

5 回答 5

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

于 2013-04-22T04:43:33.040 回答
4

这个

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

可能更容易理解。

于 2013-04-22T04:45:43.797 回答
1
:%s/^1,\(.*\)/\1,1/

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

于 2013-04-22T04:32:21.770 回答
1
:%s/1,\(.*$\)/\1,1/gc

…………………………………………………………………………………………………………

于 2013-04-22T04:38:48.383 回答
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

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

于 2013-04-23T07:27:31.263 回答