Например, test.txt содержит:
Hi
Hello
Hi world
Код ниже удаляет слово из test.txt и создает временный файл test_removed.txt, который содержит:
#!/bin/bash
echo -n Enter Input:
read input
sed -e "/^${input}/d" test.txt > test_removed.txt
Код ниже ищет Ваше слово и распечатает его. Например, если Вы будете искать "Привет", то это распечатает "Привет Привет Мир" точно как этот все в 1 строке.
#!/bin/bash
echo -n "Enter Input: "
read input
echo 'grep $input test.txt |awk -F":" {print $0}''
В моем коде ниже, я заметил, что в последней строке кода в "a" блоке кода, если вместо того, чтобы делать новую строку для каждого из этих 6 сведений спрошенной пользователя, это имело все это в 1 строке затем, код выше, чтобы удалить и искать сделает это правильно. Но с тех пор существует несколько строк для удаления, я не уверен, что сделать. Для удаления это просто просит у пользователя имя и фамилию. Искать его просто просит имя.
#!/bin/bash
ok=0;
while ((ok==0))
do
echo "Main Menu:"
echo -e "\t(a) Add"
echo -e "\t(b) Remove"
echo -e "\t(c) Seach"
echo -e "\t(d) Display contacts"
echo -e "\t(e) Exit"
echo -n "Please enter your choice:"
read choice
case $choice in
"a"|"A")
ok=1
echo -e "[Add c ontact]"
echo -n "First N ame: "
read firstName
echo -n "Last N ame: "
read lastName
echo -n "Phone Number: "
read phoneNumber
echo -n "Address: "
read address
echo -n "Email: "
read email
echo "$firstName $lastName is added to your contacts"
echo -e "First Name: $firstName\nLast Name: $lastName\nPhone Number: $phoneNumber\nAddress: $address\nEmail: $email\n\n" >> ./contacts_firstname
;;
"b"|"B")
ok=1
echo -e "[Remove a c ontact]"
echo -n "First N ame: "
read first
echo -n "Last N ame: "
read last
sed -e "/^${first}/d" contacts_firstname > contacts
;;
"c"|"C")
ok=1
echo -e "[Search c ontacts]"
echo -n "Search by the contact's First N ame: "
read FName
echo 'grep $FName contacts_firstname | awk -F":" '{print $0}''
;;
"d"|"D")
ok=1
;;
"e"|"E")
exit
;;
*)
echo "invalid answer, please try again"
;;
esac
done
echo "You entered $choice"
Формат Вашего файла имеет две последовательных новых строки (\n\n
) между каждой записью:
First Name: Elvis
Last Name: Presley
Phone Number: 123456
Address: 12 lonely street
Email: theking@graceland.com
First Name: BB
Last Name: King
Phone Number: 7891012
Address: 11 blues lane
Email: bbking@lucille.com
Можно использовать это, чтобы определить запись и удалить ее в сценарии. Например, эта команда жемчуга удалит запись Elvis из вышеупомянутого файла:
perl -000 -ne 'print unless /Elvis/ && /Presley/' test.txt
-0
устанавливает входной разделитель записей. Установка этого к 00
(с -000
) активирует 'режим абзаца', где Perl будет использовать последовательные новые строки (\n\n
) как разделитель записей. Другими словами, "строка" теперь определяется
-n
означает, "читает входную строку файла, с методической точностью и применяют сценарий, данный с -e
.
print unless /Elvis/
распечатает все строки, которые не содержат ни одного Elvis
ни Presley
. Так как "строка" теперь определяется как блок текста, разделенного двумя новыми строками (\n\n)
из-за -000
, это удалит запись Elvis из файла.i
в операторе соответствия (//i
) делает соответствие нечувствительным к регистру так, чтобы оба Elvis
и elvis
будет работать. Можно удалить его, если Вы не хотите это.Для создания этой работы со сценарием нам нужен другой шаг. Perl имеет специальное предложение %ENV
хеш, который содержит переменные окружения, в настоящее время определяемые. Например, $ENV{HOME}
Ваш $HOME
каталог. Для добавления переменной удара к этому хешу Вы должны export
это. Так, что можно сделать, отредактировать b
блок Вашего сценария, чтобы экспортировать переменные и использовать сценарий жемчуга сверху:
"b"|"B")
ok=1
echo -e "[Remove a contact]"
echo -n "First Name: "
read first
echo -n "Last Name: "
read last
## export the variables, to make them available to the `perl` script
export first
export last
## remove the entry from the file and create a backup
perl -000 -i.bak -ne 'print unless /$ENV{first}/i && /$ENV{last}/i' ./contacts_firstname
$ENV{first}
будет $first
и $ENV{last}
будет $last
. -i.bak
означает, "редактируют исходный файл и создают резервную копию, названную filename.bak". Другими словами, команда жемчуга удалит запись из contacts_firstname
и создайте резервное копирование исходного названного файла contacts_firstname.bak
. Если Вы не хотите файла резервной копии, просто используйте это вместо этого:
perl -000 -i -ne 'print unless /$ENV{first}/i && /$ENV{last}/i' ./contacts_firstname