根据其他字段编辑txt文件中的特定字段数据

时间:2013-01-14 09:28:40

标签: linux bash shell ubuntu

我有一个名为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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个字段,并将内容复制到临时文件中,然后将其重命名为原始文件。

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

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

sed -i "s/\(${updatetitle}:${updateauthor}:\)\([^:]*\)\(.*\)/\1${newPrice}\3/" file