O formato do seu arquivo tem duas novas linhas consecutivas ( \n\n ) entre cada registro:
First Name: Elvis
Last Name: Presley
Phone Number: 123456
Address: 12 lonely street
Email: [email protected]
First Name: BB
Last Name: King
Phone Number: 7891012
Address: 11 blues lane
Email: [email protected]
Você pode usar isso para identificar um registro e removê-lo em seu script. Por exemplo, este comando perl irá remover a entrada de Elvis do arquivo acima:
perl -000 -ne 'print unless /Elvis/ && /Presley/' test.txt
Explicação:
-
O
-0define o separador de registro de entrada. Definir isso como00(com-000) ativa o 'modo de parágrafo', onde o Perl usará novas linhas consecutivas (\n\n) como separador de registro. Em outras palavras, uma "linha" agora é definida -
O
-nsignifica "leia a linha do arquivo de entrada, por linha e aplique o script fornecido com-e. -
print unless /Elvis/imprime todas as linhas que contêm nenhumaElvisnemPresley. Como uma "linha" agora é definida como um bloco de texto separado por duas novas linhas(\n\n)devido ao-000, isso removerá a entrada de Elvis do arquivo. - O
ino operador de correspondência (//i) torna a correspondência insensível ao caso, de forma queElviseelvisfuncionem. Você pode removê-lo se não quiser isso.
Integre seu script
Para que isso funcione com o seu script, precisamos de mais um passo. O Perl tem o %ENV hash especial que contém as variáveis ambientais definidas atualmente. Por exemplo, $ENV{HOME} é seu diretório $HOME . Para adicionar uma variável bash a este hash, você precisa export it. Então, o que você pode fazer é editar o bloco b do seu script para exportar as variáveis e usar o script perl acima:
"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}será$firste$ENV{last}será$last. - O
-i.baksignifica "edite o arquivo original e crie uma cópia de backup denominada filename.bak". Em outras palavras, o comando perl excluirá a entrada decontacts_firstnamee criará um backup do arquivo original chamadocontacts_firstname.bak.
Se você não quiser um arquivo de backup, use-o:
perl -000 -i -ne 'print unless /$ENV{first}/i && /$ENV{last}/i' ./contacts_firstname