【问题标题】:Edit specific field data in txt file base on other field根据另一个字段编辑txt文件中的特定字段数据
【发布时间】:2013-01-14 09:28:39
【问题描述】:

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

【问题讨论】:

    标签: linux bash shell ubuntu


    【解决方案1】:

    这是另一个解决方案:

    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
    

    【讨论】:

    • 嘿,试过你的方法,效果很好。谢谢!但是快速的问题,我对 bash 真的很陌生,所以你能解释一下这段代码是如何工作的吗?
    • 抱歉,刚才缺席。除了Stream EDitor 命令的附加行之外,所有代码都是相同的。 -i 选项表示就地修改,-e "s/${updatetitle}:${updateauthor}:[^:]\+/${updatetitle}:${updateauthor}:${newPrice}/g" 是采取的操作。在动作s/A/B/g 中,我们将模式A 替换为字符串B Globally。变量替换是通过 bash 实现的,因此您可以将 shell 变量添加到您的操作中,但请记住用 " 引用。就是这样!
    【解决方案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,更新第三个字段并将内容复制到一个临时文件中,然后将其重命名回原始文件。

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

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

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

    【讨论】:

    • 使用sed 会是什么样子?
    • 嘿大师,尝试了你的方法,它有效。谢谢!你能解释一下 -v 和 '$1==title && $2==auth{$3=price;}1' 吗?我是 bash 的新手。它是如何工作的?提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多