Bash 脚本 - 如何从文本文件中删除 line/word?

Bash Script - How do i remove line/word from text file?

用户输入书名和作者(从文本文件)后,我无法从文本文件中删除一行

我试过这段代码

我做了什么:

    function remove_book
{
  echo "Title: "
  read title
  echo "Author: "
  read name

  echo $title $name < BookDB.txt
  echo "Book $title by $name successfully removed!"

  sed '/pattern to match/d' ./BookDB.txt  

  #echo "testing remove"
}

但是,它显示了这个

即使这样显示,它们实际上并没有从文件中删除。

Title: 
The Hobbit
Author: 
J.R.R. Tolkien
The Hobbit J.R.R. Tolkien
Book The Hobbit by J.R.R. Tolkien successfully removed!
Harry Potter and the Deathly Hallows J.K. Rowling
The Maze Runner James Dashner
Life Without Limits Nick Vujicic
The Hobbit J.R.R. Tolkien

期望输出:

1)  Add new book
2)  Remove existing book info
3)  Update book info and quantity
4)  Search for book by title/author
5)  Process a book sold
6)  Inventory summary report
7)  Quit
Please enter your option: 2
Title : Biography of Crocodile Dundee
Author : Crox Swamplund
    Error! Book does not exists!


1)  Add new book
2)  Remove existing book info
3)  Update book info and quantity
4)  Search for book by title/author
5)  Process a book sold
6)  Inventory summary report
7)  Quit
Please enter your option: 2
Title : C++ for dummies
Author : Edward Scissorhands
Book Title ‘C++ for dummies’ removed successfully!

Desired Output 中的书籍和作者姓名只是示例)

来自

Harry Potter and the Deathly Hallows J.K. Rowling
The Maze Runner James Dashner
Life Without Limits Nick Vujicic
The Hobbit J.R.R. Tolkien [remove one line, like this Hobbit book]

Harry Potter and the Deathly Hallows J.K. Rowling
The Maze Runner James Dashner
Life Without Limits Nick Vujicic

如何删除一行?用户输入标题和作者姓名后? 请帮助我谢谢! :)

您可能想要添加 (gnu?)sed 的 -i 选项

阅读 man sed 以了解有关 -i

的更多信息

扩大一点...

如果您希望将 sed 所做的更改保存在您的文件中,您可以使用 -i 选项,edit files in place。一个例子:

kent$  cat f
1
2
3
4
5

kent$  sed -i '/2/d' f

kent$  cat f
1
3
4
5

不要用 sed 这样做。在某些时候,某个地方的某个人会写一本名为 "Good times/bad times" 或 "Ca$h ca$h ca$h!!!1! Make $$$ in your spare time!" 或 "What you always wanted to know (and never dared to ask)" 的书,而 sed 会把它搞砸,因为特殊字符对其模式匹配引擎有意义。

您可以像这样使用 GNU awk 来完成它:

awk -i inplace -v title="$title" -v author="$name" '[=10=] != title " " author' BookDB.txt

这将 select 文件中不完全是 $title 内容的所有行,后跟一行 space,然后是 $name 的内容。由于 shell 变量没有代入 awk 代码,而是通过 awk 的 -v 参数传递,因此不会对特殊字符进行解释。

另外:您确定要原地进行吗?我喜欢保留备份以防操作出错。喜欢

cp BookDB.txt BookDB.txt~
awk -v title="$title" -v author="$name" '[=11=] != title " " author' BookDB.txt~ > BookDB.txt

然后,如果出现问题或您删除了错误的书,回滚很容易。此外,这将适用于 GNU 以外的其他 awk。

或者,您可以像这样使用 grep:

cp BookDB.txt BookDB.txt~
grep -vxF "$title $name" BookDB.txt~ > BookDB.txt

其中 -x 告诉 grep 仅当匹配是整行时才匹配,而 -F 告诉它将模式作为固定字符串而不是正则表达式。