Shell 如何使用sed在文本文件中找到相应的位置并更新它

Shell 如何使用sed在文本文件中找到相应的位置并更新它,shell,replace,sed,Shell,Replace,Sed,我想更新数量,在这种情况下是197的值,但我似乎无法用我的程序更新该值。请帮助我,因为我刚刚开始学习shell编程。谢谢 Book name:author:price:Qty:Qty Sold ================================== harry potter:james:12.99:197:101 =============================== 第一个字符类后缺少一个星号。不要忘了扩展组。第一个字符类后缺少一个星号。不要忘了扩展组。重构为使用gre

我想更新数量,在这种情况下是197的值,但我似乎无法用我的程序更新该值。请帮助我,因为我刚刚开始学习shell编程。谢谢

Book name:author:price:Qty:Qty Sold
==================================
harry potter:james:12.99:197:101
===============================

第一个字符类后缺少一个星号。不要忘了扩展组。

第一个字符类后缺少一个星号。不要忘了扩展组。

重构为使用
grep-q
;修正
if
习惯用法;将搜索锚定到行的开头;使用
read-p
代替单独的
echo
;在价格表中记录价格,以免丢失;在正则表达式中添加缺少的repeat;并在新数量值后加回分隔符冒号;另外,添加一个
else
子句,使函数不会无声地失败

function update_qty_available
{
grep -c "$title:$author" BookDB.txt > /dev/null # Look for a line with matching values

if [ $? == 0 ]; 
then # If found then offer to change Qty
echo "Update Qty to what?"
read newQty
sed -i "s/\($title:$author\):[^:]:[^:]*:/\1:$newQty/" BookDB.txt
    echo "Book's Qty has been updated successfully!"
fi

重构为使用
grep-q
;修正
if
习惯用法;将搜索锚定到行的开头;使用
read-p
代替单独的
echo
;在价格表中记录价格,以免丢失;在正则表达式中添加缺少的repeat;并在新数量值后加回分隔符冒号;另外,添加一个
else
子句,使函数不会无声地失败

function update_qty_available
{
grep -c "$title:$author" BookDB.txt > /dev/null # Look for a line with matching values

if [ $? == 0 ]; 
then # If found then offer to change Qty
echo "Update Qty to what?"
read newQty
sed -i "s/\($title:$author\):[^:]:[^:]*:/\1:$newQty/" BookDB.txt
    echo "Book's Qty has been updated successfully!"
fi

以下是如何使用
awk

script.awk的内容


以下是如何使用
awk

script.awk的内容



你应该考虑使用AWK。或者一个实际的数据库。(或实际的编程语言。)@IgnacioVazquez Abrams这是我任务的一部分,我设法更新了价格,但我似乎无法更新数量。一旦你完成了这项工作,学习如何在awk中完成。我以为J.K.罗琳写了《哈利波特》这本书。谢谢你们,你们救了我的命!你应该考虑使用AWK。或者一个实际的数据库。(或实际的编程语言。)@IgnacioVazquez Abrams这是我任务的一部分,我设法更新了价格,但我似乎无法更新数量。一旦你完成了这项工作,学习如何在awk中完成。我以为J.K.罗琳写了《哈利波特》这本书。谢谢你们,你们救了我的命!隐晦,但准确。隐晦,但准确。嗨,你给我的代码很管用,但NewQuantity某种程度上也取代了价格,我已经在编辑中解决了这个问题,还有一些其他问题。你能给我解释一下这行吗?sed-i“s/^($title:$author:[^:]*):[^::]*:/\1:$newQty:/”BookDB.txthh?它几乎是从您的原始脚本中逐字复制的(以一些小补丁为模)。如果你有一个新问题,我的建议是发布一个新问题,而不是在这里跟进,这里基本上只有你和我会看到。@Tripleee我的意思是,如果我决定在该行编辑时更新书名会怎么样?嗨,你给我的代码很管用,但是newQty替代了价格,我已经在编辑中修复了这个问题,还有一些其他问题。你能给我解释一下吗?sed-i“s/^($title:$author:[^:]*):[^::]*:/\1:$newQty:/”BookDB.txthh?它几乎是从您的原始脚本中逐字复制的(以一些小补丁为模)。如果你有一个新问题,我的建议是发布一个新问题,而不是在这里跟进,基本上只有你和我会看到。@Tripleee我的意思是,如果我决定更新书的标题,当我在那一行应该编辑吗?
BEGIN {
    FS=OFS=":"
    printf "Enter the book's name: "
    getline name < "-"
    printf "Enter author's name: "
    getline author < "-"
    printf "Enter new quantity: "
    getline newQty < "-"
}

$1==name && $2==author { $4=newQty }1
$ cat BookDB.txt 
Book name:author:price:Qty:Qty Sold
==================================
harry potter:james:12.99:197:101
===============================
$ awk -f script.awk BookDB.txt 
Enter the book's name: harry potter
Enter author's name: james
Enter new quantity: 5000
Book name:author:price:Qty:Qty Sold
==================================
harry potter:james:12.99:5000:101
===============================