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

它用分隔符分隔,以便按标题、作者、价格、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,更新第三个字段,并将内容复制到一个临时文件中,然后将其重命名回原始文件。

awk使用选项传递参数 updatetitle、updateauthor 和 newPrice -v。1st( $1) 字段根据 updatetitle 进行检查,第二个字段( $2) 根据 updateauthor 进行检查,如果它们都匹配,则使用 newPrice( $3=price) 更新第三个字段。1最后是打印每一行。

使用 sed(GNU) : (代替上面的 awk 和 mv )

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