将文本插入文件 - bash

时间:2013-10-29 04:50:20

标签: regex bash sed

我正在探索sed功能(我知道之前我曾经问过类似这样的问题,但考虑到我在正则表达式方面非常糟糕,我需要很多帮助,但这并不意味着我没有'试试自己)

我这里有一个简单的文本文件,如下所示

Id,水果名称和数量。

这次我想分别在每个水果的数量上加上水果的价格通过寻找水果名称

fruit.txt

1,apple,50
2,banana,40

我试过这个命令

sed -i -r "s/(apple.*)([,0-9]*)/\1,5/" "fruit.txt"

所以在第一个输入

 sed -i -r "s/(apple.*)([,0-9]*)/\1,5/" "fruit.txt"

我的textfile(clothes.txt)会变成这样的

1,apple,50,5
2,banana,40

在第二个输入

 sed -i -r "s/(apple.*)([,0-9]*)/\1,30/" "fruit.txt"

我的textfile(clothes.txt)会变成这样的

1,apple,50,5,30
2,banana,40

如何让它变成这样。

预期产出

第一次输入sed命令

我的textfile(fruit.txt)会变成这样的

1,apple,50,5
2,banana,40

在sed命令的第二个输入

我的textfile(fruit.txt)会变成这样的

1,apple,50,30
2,banana,40

2 个答案:

答案 0 :(得分:0)

使用此:

sed -i -r "s/(apple,[0-9]*).*/\1,30/" "fruit.txt"

此处,\1是反向引用。它匹配第一个捕获组。

之前,您的第一个捕获组匹配太多了。

答案 1 :(得分:0)

请确保您只匹配一个[,0-9]*,而不是,。你可以说:

sed -i -r 's/(apple,[^,]*).*/\1,15/' filename

此处说(apple,[^,]*)会将apple后跟,,然后将 ,的任何内容放入群组中。 .*将匹配剩余的所有内容。

这会改变

1,apple,50,5
2,banana,40

1,apple,50,15
2,banana,40