文本文件中特定行的删除

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”和作者为“Andreas”后,程序将能够进入循环并回显“书籍已成功删除”。
但是我检查了BookDB.txt文件,发现这一行尚未被删除,我想知道原因。
希望能在这里得到答案,因为我一直在互联网上进行研究,但目前还没有答案。
谢谢那些提供帮助的人! :)
2个回答

2

您正在尝试将一个bash变量(实际上是两个)传递给子程序sed,但是您将要传递的表达式用单引号括起来,这不会进行参数扩展。这意味着sed字面上看到的是$Title:$Author。请尝试将整个sed表达式用双引号括起来:

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

这将使得bashsed处理之前能够扩展$Title$Author

谢谢你们!问题解决了!非常抱歉,我一直在尝试在互联网上搜索示例/问题/答案,但是我还没有看到与我的情况类似的。 - 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
}

谢谢你们!问题解决了!非常抱歉,我一直在尝试在互联网上搜索示例/问题/答案,但是我还没有看到与我的情况类似的。 - Andres
@Andres 不用道歉。你提出了一个好问题。你解释了你的问题,展示了你尝试过什么,并说明了你想要的结果。很高兴听到你的问题已经得到了解决,你可以继续前进! :) 祝你好运! - jaypal singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接