我试过这段代码
我做了什么:
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!
(期望输出中的书籍和作者姓名只是示例)
这
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
如何删除一行?用户输入标题和作者姓名后? 请帮助我,谢谢! :)
答案 0 :(得分:3)
请勿使用sed执行此操作。在某些时候,某个地方的某个人会写一本名为“好时光/坏时光”的书。或者&#34; Ca $ h ca $ h ca $ h !!! 1!在业余时间制作$$$!&#34;或者&#34;你一直想知道的(并且从不敢问)&#34;因为特殊字符对于模式匹配引擎有意义,所以sed会搞砸它。
您可以使用GNU awk这样做:
awk -i inplace -v title="$title" -v author="$name" '$0 != title " " author' BookDB.txt
这将选择文件中不完全是$title
内容的所有行,后跟一个空格,后跟$name
的内容。由于shell变量未被替换为awk代码,而是通过awk&#39; -v
参数传递,因此不会对特殊字符进行解释。
另外:你确定要在原地进行吗?我喜欢保留备份,以防操作出错。像
cp BookDB.txt BookDB.txt~
awk -v title="$title" -v author="$name" '$0 != title " " author' BookDB.txt~ > BookDB.txt
然后,如果出现问题或者您删除了错误的书籍,那么回滚很容易。此外,这将适用于其他awks而不是GNU。
或者,您可以像这样使用grep:
cp BookDB.txt BookDB.txt~
grep -vxF "$title $name" BookDB.txt~ > BookDB.txt
-x
告诉grep匹配只有匹配是整行,而-F
告诉它将模式作为固定字符串而不是正则表达式。
答案 1 :(得分:1)
你可能想添加(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