【问题标题】:Check user input against words in text file根据文本文件中的单词检查用户输入
【发布时间】:2012-01-26 13:37:31
【问题描述】:

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

  1. 用户输入标题
  2. 用户输入作者
  3. 然后系统会在名为 BookDB.txt 的文本文件中检查用户的标题和作者输入
  4. 如果文本文件中已有记录,系统会提示错误
  5. 否则它将继续用户输入价格、可用数量和销售数量。
  6. 随后将添加图书

我尝试使用 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”作为作者,它也会引发错误。如何修改代码以便逐行检查?

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

【问题讨论】:

  • 请详细说明“无用”部分。
  • 错误信息应该发送到 stderr: echo "Error!" >&2
  • 错误信息现在有效。现在归结为检查文件中的每一行是否有任何现有的标题+作者记录。
  • Agrajag 的回答解释了“更新的问题”(见第二个问题),他的解决方案没有这个问题。它是在您编辑问题之前编写的。

标签: linux bash function shell grep


【解决方案1】:

您的代码存在 3 个问题。

首先是 grep 的 x 选项导致它只匹配完整的行,并且由于您将作者和标题放在同一行,这将不匹配。

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

第二个问题是两个grep是相互独立的。因此,如果你有一本名为“国家”的书和一本“盖曼”的书,即使你的“国家”书是“国家的财富”而盖曼的书是“阿南西男孩。

第三个问题是 grep 会找到部分匹配。如果你尝试输入“它”这本书,那么 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
}

这假设 ':' 不能出现在作者名或书名中。

【讨论】:

  • 你说得对,我已经从 grep 中取出了 x 函数,它会搜索文件中的任何现有单词。你知道我该如何解决这个问题吗?
  • 在 grep 表达式中的 $inputTitle 之前添加 ^ 也有帮助。考虑到一个好的标记值,我会使用$'\t' 又名制表符。从未在书名或作者姓名中遇到过它(与冒号不同)。
  • @choroba 我真的不知道你在这里。知道如何逐行检查吗?这样至少我可以检查文本文件每一行中现有 Title+Author 的完整性。
  • @Andres:你什么意思?答案中的代码正在寻找具有该特定标题和作者的行。你还需要什么?
  • 谢谢大家!问题解决了! :)
猜你喜欢
  • 1970-01-01
  • 2012-08-08
  • 2021-02-20
  • 1970-01-01
  • 2020-04-27
  • 2015-01-11
  • 2015-12-14
  • 2020-11-01
  • 2011-11-14
相关资源
最近更新 更多