Как я могу удалить многострочную запись из текстового файла?

Например, 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"
2
задан 17.05.2020, 20:23

1 ответ

Формат Вашего файла имеет две последовательных новых строки (\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
2
ответ дан 17.05.2020, 20:24

Теги

Похожие вопросы