使用Shell创建通讯簿脚本

时间:2018-10-28 21:20:24

标签: bash shell

我想用unix shell制作地址簿,但是字段编辑存在问题。字段是名称;数字;邮件。这是我的代码,我只想在mail(correo)匹配的行上编辑例如名称或名称和数字。谢谢大家。

#!/bin/bash
echo "Hola "$USER". Este es un script para guardar y actualizar su agenda."
echo "--------------------------------------------------------------------"
if test ! -f agenda.sh
then
    touch agenda.sh
    echo "No tenías una agenda, la creé para ti"
fi
agenda="agenda.sh"
nombre=$1
numero=$2
correo=$3

grep -i "$correo" "$agenda"

if [ $? == 0 ] 
then
    echo "Ya esta registrado con esto correo("$correo")" 
    nom=`grep $correo $agenda | cut -f1 -d ";"`
    telefono=`grep $correo $agenda | cut -f2 -d ";"`
    echo "Datos vecho: $nom $telefono"
    echo "Datos nuevo: $1 $2"
    echo "Quieres sobrescribir los datos?(y/n): "
    read respuesta
    if test $respuesta == "n"
    then
        exit 1
    elif test $respuesta == "y"
    then
        `grep $correo $agenda | cut -f1 -d ";" | sed -i "s/$nom/$1/g" $agenda`
    fi
else
    echo "$nombre;$numero;$correo" >> "$agenda"
    echo "Se ha añadido a la lista."
fi

OUTPUT

这是输出,但是问题是我的文件中的字段是这些

marco; rossi; marcorossi

不是这些:

marco; rossi; sergiodamico

你了解我的问题吗?

1 个答案:

答案 0 :(得分:1)

过滤和修改列是awk的工作。

newname="$nom"
email="$correo"
file="$agenda"
awk -F ";" '{ OFS=";"; if ($3 == "'"$email"'") $1 = "'"$newname"'"; }1' "$file"
  • -F ";"将输入字段分隔符设置为;
  • 'OFS=";"将输出字段分隔符设置为;
  • $3 == "'"$email"'"检查第三列是否等于$ email字符串
  • $1 = "'"$newname"'",然后将第一列设置为新名称
  • 1脚本末尾的非零值使awk可以打印行

@edit

Och,我在awk方面并不擅长,并且像shell utils一样,我看到两个选择:

  • 使用grep -v -x '[^;]*;[^;];'"$email"从文件中过滤出这一行,并将该行添加到其中:

email_searched=...
IFS=';' read -r _ number _ < <(grep -x '[^;];[^;];'"$email_searched" "$file")
{
   grep -v -x '[^;]*;[^;];'"$email_searched" "$file";
   printf "%s" "$newname;$number;$email_searched"
} | sponge "$file"
  • 您可以使用while读取循环读取整个文件并替换该行(这是最慢的方法):

while IFS=';' read -r name number email; do
     if [ "$email" = "$email_searched" ]; then
          name="$newname"
     fi
     printf '%s' "$name;$number;$email"
done <"$file" | sponge "$file"