bash - 尝试使用 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
}
解决方案
在行中:
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 列。
推荐阅读
- delphi - 在表单设计器中单击时如何避免不必要的组件对齐?
- php - MySQLi 与 PHP 8.0.6:不再支持
- flutter - 在 null 上调用了 getter 'length'。接收方:空。如何解决列表列表的此错误?
- flutter - 是否可以同时将有状态小部件和无状态小部件作为另一个类的子类型?
- terraform - 基于地图列表中地图次要键的 Terraform 过滤器
- web-scraping - 我可以从某个网站上抓取数据并在我的网站上分享这些数据吗?
- wordpress - 隐藏 Woocommerce 产品详细信息页面并重定向到会员 url(目前没有解决方案,因为 aff 链接是由插件动态创建的)
- c++ - 从文件扩展名中删除点
- linux - 从 linux shell 脚本中的文本文件打印下一个序列号
- flutter - 通过 ListView.Builder Flutter 搜索文本和高亮匹配