0

从文本文件数据库格式,

客户:组屋:价格:左:有货

泰德:rm4:34:197:101

bash shell 脚本,

read -p $'Price: '  Price2
sed -i "s/$Customer:$HDB:$Price/$Customer:$HDB:$Price2/g" CustomerDB.txt

当我输入 43 时,数据库返回

泰德:rm4:4334:197:101

我如何将其替换为 43 而不是 34?

4

2 回答 2

0

好像$Price是空的。你确定它包含旧价格吗?如果您想替换所有价格而不考虑旧值,您可以使用

sed -i "s/$Customer:$HDB:[0-9]*/$Customer:$HDB:$Price2/g" CustomerDB.txt
于 2013-01-18T11:34:47.093 回答
0

就我个人而言,我会使用 awk 而不是 sed,因为它会自动将行解析为单独的字段。

read -p "customer: " cust
read -p "new price: " price2

awk -F : -v OFS=: -v cust=$cust -v price=$price2  '{ if($1==cust){ $3=price } ; print}' file

那么发生了什么?

那么 -F : 设置 : 作为字段分隔符 -v var=val 设置一些变量以在 awk 脚本中使用,在这种情况下,OFS 以及 cust 和 price 变量

实际的 awk 脚本将第一个字段 ($1) 与 cust var 进行比较。如果它们相同,则将第三个字段设置为等于价格变量。

然后我们打印出由 OFS var 的值分隔的所有字段(默认情况下为空格,但我们已覆盖为 :'s)

这是一个很好的 awk 介绍

于 2013-01-18T11:41:49.403 回答