根据文本文件中的单词检查用户输入

时间:2012-01-26 13:37:32

标签: linux bash function shell grep

我正在为我的程序选择一个选项,它应该像这样工作:

  1. 用户输入标题
  2. 用户输入作者
  3. 系统然后检查用户的标题&作者在名为BookDB.txt
  4. 的文本文件中输入
  5. 如果文本文件中已有记录,系统将提示错误
  6. 否则它将继续用户输入价格,可用数量和销售数量。
  7. 本书将被添加
  8. 我尝试用grep玩,但无济于事。 以下是我对此特定功能的代码。

    function fnAddBook()
    {
    echo "Title: "
    read inputTitle
    echo "Author: "
    read inputAuthor
    
    if grep -Fq "$inputTitle" BookDB.txt; then
         if grep -Fq "$inputAuthor" BookDB.txt; then
         echo "Error!"
      fi
    else
      echo "Price: "
      read inputPrice
      echo "$inputTitle:$inputAuthor:$inputPrice" >> BookDB.txt
      echo "New Book successfully added!"
    fi
    }
    

    BookDB.txt的内容 内容格式|标题:作者:价格:QtyAvail:QtySold

    Hello World:Andre:10.50:10:5
    Three Little Pig:Andrew Lim:89.10:290:189
    All About Ubuntu:Ubuntu Team:76.00:55:133
    Catch Me If You Can:Mary Ann:23.60:6:2
    Happy Day:Mary Ann:12.99:197:101
    

    更新的问题: 在这种情况下,即使我输入“Catch Me If You Can”作为标题+“Ubuntu Team”作为Author,它也会引发错误。如何修改代码,使其逐行检查?

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

1 个答案:

答案 0 :(得分:4)

您的代码有3个问题。

第一个是grep的x选项使它只匹配完整的行,并且因为你将作者和标题放在同一行上,所以这将不匹配。

使用x选项“Gaiman”与“Gaiman:Nation:$ 20”不匹配,如果从grep-options中删除x,这将有效。

第二个问题是两个greps是相互独立的。因此,如果你有一本名为'Nation'的书和一本'Gaiman'的书,它将被认为是一场比赛,即使你所拥有的'国家'一书是'国家的财富'和你已经获得的Gaiman书籍' Anansi Boys'。

第三个问题是grep会找到部分匹配。如果你试图输入“It”这本书,那么grep会得出它已经存在于数据库中,因为“它来自沙漠”是。

您需要一个标记值来描述标题以解决此问题。 (哨兵必须是一些在书名或作者姓名中不存在的角色)

function fnAddBook()
{
echo "Title: "
read inputTitle
echo "Author: "
read inputAuthor
if grep -Fq "$inputTitle:inputAuthor:" BookDB.txt
then
    echo "Error!"
else
   echo "Price: "
   read inputPrice
   echo "$inputTitle:$inputAuthor:$inputPrice" >> BookDB.txt
   echo "New Book successfully added!"
fi
}

这假设在主题词或书名中不会出现':'。