删除文本文件中的特定行

时间:2012-01-26 16:04:02

标签: linux bash shell sed

我正在开发一个选项,如果用户输入确切的标题和作者,该选项将能够删除指定的行。

然而,我无法使其发挥作用。

我的功能内容如下所示

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”和为作者键入“Andreas”之后,该程序将能够进入循环并成功删除echo-ed Book。

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

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

提前感谢那些帮助过的人! :)

2 个答案:

答案 0 :(得分:2)

你试图将一个bash变量(实际上是两个)传递给一个子程序(sed),但是围绕你用单引号传递的表达式,这样做没有参数扩展。这意味着sed确实会看到$Title:$Author。尝试将整个sed表达式放在双引号中:

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

这将允许bash$Title进入之前展开$Authorsed

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