【问题标题】:Using grep and sed to substitude a string?使用 grep 和 sed 替换字符串?
【发布时间】:2018-02-24 00:37:19
【问题描述】:

我对编写 bash 相当陌生,我对我的代码的错误/问题有点困惑。我有两个主要问题。如果P) 我想看看某个文件是否存在。如果它存在,我想用newbalance 更新balance

P) read -p "Enter email: " email
   read -p "Enter payment amount: " payment
   newbalance=$(echo $payment + $balance | bc)
   if [ -f $email ]; then
       sed -i "s/$balance/$newbalance/" $email
       #also tried
       #find . -type f -name "$email" -exec sed -i "s/${balance}{newbalance}/" {} \;
   else
       echo -e "Error: customer not found\n\n"
   fi
   balance=$newbalance
   continue
   ;;

当我尝试读取 payment(例如 100.00)时收到错误消息:

(standard_in) 2: syntax error
sed: -e expression #1, char 0: no previous regular expression

它本身的文件格式非常简单,余额只出现一次。

email  name
apt-XX rent balance duedate

当我重定向回声以修改文件时,代码有效。现在我已经尝试实现sed 代码已经停止工作,我不确定是什么原因造成的。我已经尝试将findsed 一起使用,但这也不起作用。我查看了多个堆栈溢出问题,但示例与我的相似。

这是我正在处理的文件之一

jboat@xyz.com John Boat
APT-5B 1100.00 100.00 2017-10-02

【问题讨论】:

  • newbalance= 之间有空格。应该是newbalance=$(...
  • newbalance 是注册商标。在遇到麻烦之前,您可能应该使用不同的变量名。
  • 从您的文件中包含一组示例行,以便清楚您正在处理的数据类型。
  • @codeforester 我添加了一个文件示例(其中电子邮件也是文件名)。

标签: bash sed find


【解决方案1】:

你可以使用bash来做计算,不需要bc。

newbalance=$((payment + balance))

sed 命令没问题,你可能得到了错误,因为其中一个变量包含废话。

【讨论】:

  • 这似乎仍然给了我一个错误./menu.bash: line 32: 130.00: syntax error: invalid arithmetic operator (error token is ".00"). 我的印象是我需要 bc 用于浮动@yacc。
  • 好吧,我以为都是整数。然后执行echo "s/$balance/$newbalance/" 来检查 sed 得到的正则表达式。 @below_avg_st
  • 有了回声,我得到了(standard_in) 2: syntax error s// sed: -e expression #1, char 0: no previous regular expression@yacc。
【解决方案2】:

您收到该错误的最可能原因是 $balance 为空。例如:

$ echo 100.00 | sed 's//200.00/'
sed: -e expression #1, char 0: no previous regular expression

(回声就在那里,因为 sed 无论如何都需要输入。)

因此,您需要跟踪 $balance 的价值所在,并确保没有失败。

但是,由于它仍然容易出现故障,我建议使用 AWK 来替代更具弹性的方法:

awk -v newbalance="$newbalance" 'FNR==2 {$3=newbalance; print;}' "$email" > "$email.tmp" && mv "$email.tmp" "$email"

这会将名为 newbalance 的 awk 变量设置为 bash 变量 $newbalance 的值,然后运行脚本。 FNR 告诉它要读取哪一行(在本例中为文件中的第二行),$3=newbalance 将该行中第三个字段的值更改为我们之前传入的值。

末尾的mv 只是因为旧版本的 awk 无法就地编辑文件。见:awk save modifications in place

请注意,如果您进入这个兔子洞,您可能会在完成之前在 awk 中重写整个脚本。为了获得灵感,您可以先将算术移入 awk 本身:

awk -v payment="$payment" 'FNR==2 {$3+=payment; print;}' "$email" > "$email.tmp" && mv "$email.tmp" "$email"

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多