2012-01-26 121 views
3

我正在处理一个选项,如果用户键入确切的标题和作者,将能够删除指定的行。删除文本文件中的特定行

但是我无法使它工作。

我的功能内容如下所示

fnRemoveBook() 
{ 
echo"Title: " 
read Title 
echo"Author: " 
read Author 

if grep -Fqe "$Title:$Author" BookDB.txt; then 
    sed -i '/"$Title:$Author"/ d' BookDB.txt 
    echo "Book removed successfully!" 
else 
    echo "Error! Book does not exist!" 
fi 
} 

的BookDB内容显示如下

Hello World:Andreas:10:5:2 
Teaching:Mary Ann:50:23:5 

我在“Hello World”的键后的标题和“安地列斯”的作者,程序将能够进入循环并成功删除echo-ed Book。

但是我检查了BookDB.txt这行还没有被删除,我想知道为什么。

我希望我能在这里得到一些答案,因为我一直在网上做研究,但目前还没有答案。

在此先感谢那些帮助! :)

回答

2

你想一个bash变量(二,实际上)传递到子程序(sed),但围绕着你传递单引号的表达,它不没有参数扩展。这意味着sed字面上看到$Title:$Author。尝试把双引号全sed表达:

sed -i "/$Title:$Author/d" BookDB.txt 

这将使bash扩大$Title$Author他们进入sed之前。

+0

感谢你们!解决了我的问题! 我很抱歉,因为我一直试图在互联网上搜索示例/问题/答案,但我还没有看到任何类似于我的情况。 – Andres

1

使用单引号不会插入变量。尝试这样的事情 -

fnRemoveBook() 
{ 
echo "Title: " 
read Title 
echo "Author: " 
read Author 

if grep -Fqe "$Title:$Author" BookDB.txt; then 
    sed -i "/$Title:$Author/ d" BookDB.txt # <---- Changes made here 
    echo "Book removed successfully!" 
else 
    echo "Error! Book does not exist!" 
fi 
} 
+0

感谢你们!解决了我的问题! 我很抱歉,因为我一直试图在互联网上搜索示例/问题/答案,但我还没有看到任何类似于我的情况。 – Andres

+0

@Andres你不必感到抱歉。你发布了一个很好的问题。你解释了你的问题,展示了你所尝试过的并说明了你想要的结果。很高兴听到你的问题已经解决,你很好去! :) 祝你好运!! –