我想用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
这是输出,但是问题是我的文件中的字段是这些
marco; rossi; marcorossi
不是这些:
marco; rossi; sergiodamico
你了解我的问题吗?
答案 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 IFS=';' read -r name number email; do
if [ "$email" = "$email_searched" ]; then
name="$newname"
fi
printf '%s' "$name;$number;$email"
done <"$file" | sponge "$file"