【问题标题】:Error trying to replace a line in bash using awk and sed尝试使用 awk 和 sed 替换 bash 中的一行时出错
【发布时间】:2020-10-26 01:17:01
【问题描述】:

我正在大学学习 Bash 脚本,但在创建替换行的功能时遇到了问题。 我在这里要做的就是允许用户在菜单上选择一本书,并将选择存储在数据库中,之后用户应该能够选择新的库存值,然后程序应该找到该行并将其替换为与新股票价值的另一行。 库存存储在文件的第五列。数据库中的数据是这样组织的:

1:O_Mágico_de_Auschwitz:19,80€:José Rodrigues dos Santos:69:2020
addStock(){
awk -F: '{print $2 " " $5}' baseDados.txt > output.txt
ar=($(cat output.txt))
escolhaLivro=$(dialog --stdout --title "Add Stock" --menu "Livros" 0 0 0 "${ar[@]}" )
echo ${escolhaLivro}
uservalue=$(dialog --stdout --title "Add Stock" --inputbox "Escreve o stock desejado: " 0 0)
nrLinha=$(grep -n "$escolhaLivro" $file | cut -d: -f1)


#this two lines are the ones causing the problems...I cant understand bash quotation
newValue=$(grep "$escolhaLivro" $file | awk -F:  'BEGIN {OFS=":"} $5=$uservalue')
sed -i "$nrLinha s/.*/$newValue/" $file
}

【问题讨论】:

  • 请查看How to create a minimal, reproducible example,然后返回并相应地更新您的问题;特别是,提供 baseDados.txt 的内容、您的代码生成的错误和/或不正确的输出,以及(正确的)预期输出
  • 你会很好地阅读和审查:stackoverflow.com/tags/bash/info。搜索“在询问有问题的代码之前”和“如何将糟糕的脚本变成好问题”。祝你好运。
  • 本练习的目的是解决所述问题,还是使用示例代码中包含的工具 (awk, cat, sed, grep ...)?可以使用awk 生成更好的问题解决方案,但这也不是干净的,因为只有最新的awks 有--inplace-edit 选项(不是确切的名称)。祝你好运。
  • 缺少对$file 的引用...(但希望我猜到了它的正确值)
  • 搜索[awk] in place edit时查看结果。祝你好运。

标签: bash awk sed


【解决方案1】:

行内:

newValue=$(grep "$escolhaLivro" $file | awk -F:  'BEGIN {OFS=":"} $5=$uservalue')

awk 进程不知道值$uservalue,因此它的计算结果为$0,这是完整的行。

您可以像这样将变量传递给 awk:

newValue=$(grep "$escolhaLivro" $file | awk -F: -v uservalue="$uservalue" 'BEGIN {OFS=":"} $5=uservalue')

在此之后newvalue 应该具有正确的值,并更改了第 5 列。

【讨论】:

  • awk -F: -v uservalue="$uservalue" 'BEGIN {OFS=":"} $5=uservalue') 这很有效,但我的代码的最后一行仍然存在问题,我在那里做错了什么?
  • 哎呀,改成-v?
【解决方案2】:

修复了程序!谢谢@Luuk

    addStock(){
    awk -F: '{print $2 " " $5}' baseDados.txt > output.txt
    ar=($(cat output.txt))
    escolhaLivro=$(dialog --stdout --title "Add Stock" --menu "Livros" 0 0 0 "${ar[@]}" )
    echo ${escolhaLivro}
    uservalue=$(dialog --stdout --title "Add Stock" --inputbox "Escreve o stock desejado: " 0 0)
    oldvalue=$(grep "$escolhaLivro" $file)
    newValue=$(grep "$escolhaLivro" $file | awk -F: -v uservalue="$uservalue" 'BEGIN {OFS=":"} $5=uservalue')
    sed -i "s/$oldvalue/$newValue/g" $file
    }

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2019-07-20
    • 2013-05-30
    • 2021-12-26
    • 2016-10-30
    • 2016-08-26
    相关资源
    最近更新 更多