2015-01-16 2 views
1

я не могу удалить как одну строку из текстового файла после того, как пользователь вводит название книги и автора (из текстового файла)Bash Script - Как удалить строку/слово из текстового файла?

я попытался этот код

Что я сделал:

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! 

(книги и собственные имена в Желаемая 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 

Как удалить одну строку? после ввода пользователем названия и имени автора? помогите мне, пожалуйста, спасибо! :)

+1

@fedorqui i отредактировал вопрос – Preeyah

+1

Еще один вопрос [BookDB.txt] (https://stackoverflow.com/search?q=%5Bshell%5D+BookDB.txt+is%3Aquestion). –

+0

wow .. no way .. спасибо! @glennjackman: D – Preeyah

ответ

3

Не делайте этого с sed. В какой-то момент кто-то где-нибудь напишет книгу под названием «Хорошие времена/плохие времена» или «Ca $ h ca $ h ca $ h !!! 1! Сделайте $$$ в свое свободное время!» или «То, что вы всегда хотели знать (и никогда не осмеливались спросить)», и sed будет ужасно испортить его, потому что специальные символы имеют смысл для своего шаблона, соответствующего двигателю.

Вы можете сделать это с GNU AWK, как это:

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

Это позволит выбрать все строки из файла, которые не являются именно содержание $title следует один пробел, затем содержимое $name. Поскольку переменные оболочки не заменяются в awk-коде, а передаются через параметр awk -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 говорит его взять образец в виде фиксированной строки, а не регулярное выражение ,

+0

эй .. это работает! Спасибо – Preeyah

1

вы можете добавить (гну?) СЕПГ -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 
+1

@fedorqui ok, "explanded" немного ... :( – Kent

+0

вот так лучше :) – fedorqui

Смежные вопросы