Например, 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
Код ниже ищет ваше слово и распечатает его. Например, если вы выполните поиск «Привет», он напечатает «Привет, мир» точно так же, как все в одной строке.
#!/bin/bash
echo -n "Enter Input: "
read input
echo 'grep $input test.txt |awk -F":" {print [112]}''
В своем коде ниже я заметил, что в последней строке кода в блоке кода «a», если вместо создания новой строки для каждой из 6 частей информации, запрашиваемой у пользователя, она Если бы все было в одной строке, то приведенный выше код для удаления и поиска сделает это правильно. Но так как нужно удалить несколько строк, я не уверен, что делать. Чтобы удалить, он просто просит пользователя имя и фамилию. Для поиска просто просит имя.
#!/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 [113]}''
;;
"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
, означает, "читает входную строку файла, с методической точностью и применяют сценарий, данный с [1 110].
print unless /Elvis/
распечатает все строки, которые не содержат ни Elvis
, ни Presley
. Так как "строка" теперь определяется как блок текста, разделенного двумя новыми строками (\n\n)
из-за эти -000
, это удалит запись Elvis из файла. i
в операторе (//i
) соответствия делает соответствие нечувствительным к регистру так, чтобы и Elvis
и elvis
работал. Можно удалить его, если Вы не хотите это. Для создания этой работы со сценарием, нам нужен другой шаг. Perl имеет специальное предложение %ENV
хеш , который содержит переменные окружения, в настоящее время определяемые. Например, $ENV{HOME}
Ваш $HOME
каталог. Для добавления переменной удара к этому хешу Вам нужно к [1 123] это. Так, что можно сделать, отредактировать 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". Другими словами, команда жемчуга удалит запись от [1 130] и создаст резервное копирование исходного файла, названного contacts_firstname.bak
. , Если Вы не хотите файла резервной копии, просто используйте это вместо этого:
perl -000 -i -ne 'print unless /$ENV{first}/i && /$ENV{last}/i' ./contacts_firstname