首页 > 解决方案 > 尝试使用 awk 和 sed 替换 bash 中的一行时出错

问题描述

我正在大学学习 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
}

标签: bashawksed

解决方案


在行中:

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

awk 进程不知道 value $uservalue,因此它评估$0哪一个是完整的行。

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

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

在这之后newvalue应该有正确的值,改变了第 5 列。


推荐阅读