2

我想使用 vim 编辑器或 sed 命令将最后一列的值替换为另一个值。我尝试了以下命令,但它有时会替换我第二列中已经存在的数据。

:%s/,3/,2/

我的样本数据:

410339,166,1430,3
410340,112,1840,3
410341,109,1315,3
410342,123,1435,3
410343,230,3200,3
410344,857,36975,3
410345,125,4440,3
410346,105,1460,3
410348,122,1150,3
410349,314,2380,3
410350,132,4650,3
410351,136,7465,3
410352,103,1775,3
410353,101,1095,3
410354,101,1360,3
4

4 回答 4

4

您需要表明您想要换行符:

:%s/,3$/2/
于 2012-11-26T02:24:24.737 回答
3

要完成您在 Vim 中的尝试,只需将匹配的表达式用 . 锚定到行尾$

:%s/,3$/,2/

产生:

410339,166,1430,2
410340,112,1840,2
410341,109,1315,2
410342,123,1435,2
410343,230,3200,2
410344,857,36975,2
410345,125,4440,2
410346,105,1460,2
410348,122,1150,2
410349,314,2380,2
410350,132,4650,2
410351,136,7465,2
410352,103,1775,2
410353,101,1095,2
410354,101,1360,2
于 2012-11-26T02:24:19.947 回答
3

我会使用awk

awk '{$NF=2}1' FS=, OFS=,

这无条件地使最后一列的值为 2。如果所需的替换是字符串,则需要使用引号或更灵活的:

awk '{$NF=r}1' FS=, OFS=, r="the string to put in the last column"

您可以将替换限制为具有值 3 的那些列:

awk '$NF==3{$NF=r}1' FS=, OFS=, r="the string to put in the last column"

而且,要在 vim 中执行此操作,只需执行以下操作:

:%! awk ...
于 2012-11-26T14:03:07.720 回答
2

GNU sed

如果最后一列只是“3”:

sed -i 's/3$/2/' file

如果最后一列可能类似于“13”:

sed -i 's/,3$/,2/' file

旗帜-i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if extension supplied)
于 2012-11-26T02:39:26.710 回答