【问题标题】:Editing a text file in linux using sed使用 sed 在 linux 中编辑文本文件
【发布时间】:2018-01-24 14:25:10
【问题描述】:

我创建了一个“模拟”银行系统的脚本,该系统允许用户根据需要检查余额以及取款或存款。有关客户、他们的余额等的详细信息保存在名为 data.txt 的文本文件中。当客户取款或存款时,应相应调整文本文件。问题是,像这样使用 sed

sed -i 's/$balance/$($balance + $depositval)/' data.txt 

不起作用。我也尝试过 grep 但也没有运气。有没有办法使用 sed 将客户的余额更改为从他们的余额中产生的总和以及他们希望存入的金额(如果他们需要取款,则减去)并作为参数传递一个变量?

PS:这是我的data.txt文件的内容:

12345 Nick Abrams A 25575
67890 George Michaels I 10000
14680 Jack Jordan A 2960
13670 Michael Patton I 5065

第一个字段是客户的卡号。 A 和 I 指示客户的卡是活动的还是非活动的。第五个领域是平衡。顺便说一句,我正在使用 bash shell。使用 read 命令从键盘读取 depositval,使用 grep 从文本文件中找到余额。

为了将来参考,如果有人需要做类似的事情,我发现我第一次尝试像这样使用 sed

sed -i 's/$balance/$($balance + $depositval)/' data.txt

也可以,只需要将 ' 更改为 "

【问题讨论】:

  • sed 不知道如何做算术。 bash 只处理整数,不处理浮点数。我建议你尝试使用编程语言来编写这个程序。
  • sed 中绝对不支持算术运算。也不清楚您期望如何提取加法的值。 GNU sed 中有一个奇怪的 hack,它允许您在替换部分中运行 shell 命令,但您确实应该使用不同的工具。 awk 在这种事情上很受欢迎,但你仍然需要弄清楚如何告诉 Awk 输入值(大概是通过解析输入行来找出 balance 的先前值和 depositval)。
  • 感谢您的编辑。您还没有告诉我们如何为 depositval 设置一个值。
  • @tripleee 更新了我的问题。我希望我能让我更容易理解我想要做什么。

标签: linux bash sed


【解决方案1】:

使用文本文件而不是数据库效率非常低,因为必须为每个事务重写整个文件。但这里是解决方案的开始。

awk -v deposit="123.45" -v account="14680" '$1 == account { $5 += deposit }' file >newfile &&
mv newfile file

GNU Awk 可以选择就地重写输入文件,因此您不必手动将新文件移回到旧文件之上。

【讨论】:

  • 不错。这是否使用变量代替数字来工作? (即,而不是使用“123.45”,我宁愿使用“$balance”)。
  • 那就这样做吧。 (但在这里,我们传入的值是 depositval 而不是 balance。 Awk 将一举读取并更新余额。您可以轻松添加一个约束,例如“如果客户提款的金额超过他们帐户中的金额,或者帐户处于非活动状态,则退出并显示错误”但此注释字段不是完整的 Awk Programming 101。)
  • 为了完整起见,双引号内的内容(但不是单引号内的内容,甚至一对单引号内的双引号内的内容)是 shell 的域,而不是 awk 的域。
  • 使用所需变量更改数字有效。谢谢你帮助我。问题已回答。
  • @EdMorton 我的潜意识告诉我,这只是一个玩具示例,无法将其用于任何实际重要的系统,但当然你是对的。更新
【解决方案2】:

这是一个测试用例。 $(( ... )) 算术运算特定于 bash

$ a=1
$ b=2
$ cat data.txt
name 1

$ sed "s/$a/$(( $a + $b ))/g" data.txt
name 3

【讨论】:

  • 我可以想象 OP 设想输入值来自sed 当前正在处理的文件,但无法访问data.txt,我们显然在这里疯狂地推测。
  • 正确,根据推测,我知道 OP 事先知道$balance 并且它们在 OP 的输入文件中以数字形式存在。
  • 如果有用的话,我会编辑我的问题并添加我的 data.txt 文件。
  • 这里没有特定于 GNU sed 的内容;就sed 而言,这应该可以一直移植到黑暗时代;但是$(( ... )) 的算术是一个仅限 Bash 的功能,因此这不适用于其他一些 shell。
  • 哪个 (bash) 是 OP 的标签之一,到目前为止我只测试了 GNU sed。有些人在没有提及限制(如果有的话)的情况下投了反对票。只是为了安全:-)
猜你喜欢
  • 2012-04-19
  • 2015-02-27
  • 1970-01-01
  • 2011-12-17
  • 2011-05-26
  • 2015-01-14
  • 1970-01-01
  • 2022-07-12
  • 2018-10-18
相关资源
最近更新 更多