2

次のデータを含む BookDB.txt という名前の txt ファイルがあります。

Little Prince:The Prince:15.00:188:9
Lord of The Ring:Johnny Dept:56.80:100:38
Catch Me If You Can:Mary Ann:23.60:6:2
Happy Day:Mary Ann:12.99:197:101

Title、Author、Price、QtyLeft、および QtySold でグループ化されるように、区切り記号で区切られます。

これが私の質問です。タイトルと著者の入力を求めるプロンプトが表示されると、BookDB.txt をチェックしてその本の行を見つけ、その価格を編集します。実際にやってみたらどうですか?これは私がこれまでやってきたことです

read -p $'Title: '  updatetitle
read -p $'Author: '  updateauthor

#check if book exist in BookDB.txt
if grep -Fq "${updatetitle}:${updateauthor}" BookDB.txt
then
    read -p $'NewPrice: '  newPrice
    #This is the part i'm stuck
else
     echo "Book does not exist"
fi
4

2 に答える 2

3

別の解決策は次のとおりです。

if grep -Fq "${updatetitle}:${updateauthor}" BookDB.txt
then
    read -p $'NewPrice: '  newPrice
    sed -i -e "s/${updatetitle}:${updateauthor}:[^:]\+/${updatetitle}:${updateauthor}:${newPrice}/g" BookDB.txt
else
     echo "Book does not exist"
fi
于 2013-01-14T09:52:56.657 に答える
2

一方通行:

if grep -Fq "${updatetitle}:${updateauthor}" BookDB.txt
then
    read -p $'NewPrice: '  newPrice
    awk -F: -v title="$updatetitle" -v auth="$updateauthor" -v price=$newPrice '$1==title && $2==auth{$3=price;}1' OFS=":" BookDB.txt >> BookDB.txt_tmp
    mv BookDB.txt_tmp BookDB.txt
else
     echo "Book does not exist"
fi

を使用するawkと、3 番目のフィールドが更新され、内容が一時ファイルにコピーされ、元のファイルに名前が変更されます。

パラメータ updatetitle、updateauthor、および newPrice はawk、オプションを使用してに渡され-vます。最初の ( $1) フィールドは updatetitle に対してチェックされ、2 番目のフィールド ( $2) は updateauthor に対してチェックされ、両方が一致する場合、3 番目のフィールドは newPrice ( $3=price) で更新されます。1最後に、すべての行を印刷することです。

sed(GNU) の使用: (上記の awk と mv の代わりに)

sed -i "s/\(${updatetitle}:${updateauthor}:\)\([^:]*\)\(.*\)/\1${newPrice}\3/" file
于 2013-01-14T09:39:18.380 に答える