2013-01-14 52 views
2

我有一個名爲BookDB.txt的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 

回答

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及以上毫伏)

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

它是如何將看起來像'sed'? –

+0

嘿古魯,嘗試了你的方法,它的工作原理。謝謝!你能解釋一下-v和'$ 1 == title && $ 2 == auth {$ 3 = price;} 1'嗎?我新來bash。它是如何工作的?提前致謝! – user1958567

+0

@ user1958567:更新評論 – Guru

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 
+0

嘿,試過你的方法並且工作。謝謝!但是很快的問題,即時通訊對於bash來說真的很新穎,所以你可以解釋一下這些代碼是如何工作的? – user1958567

+0

對不起,剛纔缺席。所有的代碼都是相同的,只不過是一個'Stream EDitor'命令的附加行。 '-i'選項指示就地修改,'-e「s/$ {updatetitle}:$ {updateauthor}:[^:] \ +/$ {updatetitle}:$ {updateauthor}:$ {newPrice}/g」 '是採取的行動。在動作's/A/B/g'中,我們用字符串'B' * G *替換模式'A'。變量替換是由bash實現的,所以你可以在你的動作中添加shell變量,但是請記住用'''引用。就是這樣! –

+0

@ user1958567。 –

相關問題