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
-0
define 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
-n
significa "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 nenhumaElvis
nemPresley
. 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
i
no operador de correspondência (//i
) torna a correspondência insensível ao caso, de forma queElvis
eelvis
funcionem. 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á$first
e$ENV{last}
será$last
. - O
-i.bak
significa "edite o arquivo original e crie uma cópia de backup denominada filename.bak". Em outras palavras, o comando perl excluirá a entrada decontacts_firstname
e 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