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

この場合は 197 の値である QTY を更新したいのですが、シェル プログラミングの学習を始めたばかりなので、自分のプログラムで値を更新できないようです。助けてください。ありがとう

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
4

3 に答える 3

1

最初の文字クラスの後にアスタリスクがありません。そして、グループを展開することを忘れないでください。

于 2013-07-25T05:06:12.283 に答える
0

で行う方法は次のawkとおりです。

の内容script.awk:

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
===============================
于 2013-07-25T05:30:19.510 に答える
0

使用するようにリファクタリングされましたgrep -qifイディオムを修正します。検索を行頭に固定します。read -p別の代わりに使用しechoます。失われないように、括弧内の価格を取得します。不足している繰り返しを正規表現に追加します。新しい数量値の後に区切りコロンを追加します。elseまた、関数がサイレントに失敗しないように句を追加します。

function update_qty_available
{
    if grep -q "^$title:$author:" BookDB.txt
    then
        read -p "Update Qty to what?" newQty
        sed -i "s/^\($title:$author:[^:]*\):[^:]*:/\1:$newQty:/" BookDB.txt
        echo "Book's Qty has been updated successfully!"
    else
        echo "$0: BookDB.Txt: no '$title' by '$author'" >&2
    fi
}
于 2013-07-25T05:15:44.297 に答える