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

Например, 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"
2
задан 27 March 2014 в 03:49

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 означает, "читает входную строку файла, с методической точностью и применяют сценарий, данный с -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
2
ответ дан 27 March 2014 в 03:49

Другие вопросы по тегам:

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