Bash 使用shell创建通讯簿脚本
我想用unixshell制作一个地址簿,但是我对字段的编辑有问题。字段为name;数字邮政这是我的代码,我只想编辑mailcorreo匹配的行中的名称或名称和编号。谢谢大家Bash 使用shell创建通讯簿脚本,bash,shell,Bash,Shell,我想用unixshell制作一个地址簿,但是我对字段的编辑有问题。字段为name;数字邮政这是我的代码,我只想编辑mailcorreo匹配的行中的名称或名称和编号。谢谢大家 #!/bin/bash echo "Hola "$USER". Este es un script para guardar y actualizar su agenda." echo "--------------------------------------------------------------------"
#!/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
这是输出,但问题是在我的文件中,字段如下所示:
马可;罗西;马可罗西
而不是这些:
马可;罗西;塞尔吉奥达米科
你明白我的问题吗?过滤和修改列是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打印该行
@编辑
Och,我不擅长awk,就像shell utils一样,我看到两种选择:
使用grep-v-x'[^;]*;从文件中筛选出行;[^;];'$发送电子邮件并将该行添加到其中:
您可以使用while read循环读取整个文件,并替换该行。这是最慢的方法:
不要使用反勾号,因为它们已被弃用。使用$。另外,“grep…”行将尝试执行命令的输出,您只想执行命令,而不是命令的输出。谢谢您的回答,很遗憾,出于学术原因,我不得不在没有awk的情况下执行此操作。@SergioD'Amico编辑了回答。我必须覆盖该文件,我不明白printf是如何生成的。我认为该命令是sed..我使用覆盖文件,因为您不能在同一时间读取和写入同一文件,即.cat文件
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"