Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用shell创建通讯簿脚本_Bash_Shell - Fatal编程技术网

Bash 使用shell创建通讯簿脚本

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 "--------------------------------------------------------------------"

我想用unixshell制作一个地址簿,但是我对字段的编辑有问题。字段为name;数字邮政这是我的代码,我只想编辑mailcorreo匹配的行中的名称或名称和编号。谢谢大家

#!/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"