使用 Bash 构建地址簿 - 使用 sed 编辑字段会产生错误结果

使用 Bash 构建地址簿 - 使用 sed 编辑字段会产生错误结果

我想使用 Bash 制作地址簿,但在编辑字段时遇到了问题。

这些字段是name;number;mail

这是我的代码。我想编辑姓名,或者姓名和号码,只在 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
    chmod 770 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
         sed -e "s/$nom/$1/g" -e "s/$telefono/$2/g" $agenda >/tmp/salida && mv /tmp/salida $agenda
         echo "Datos sobrescritos"
         sort -k 2 -t";" $agenda
    fi
else
    echo "$nombre;$numero;$correo" >> "$agenda" 
    echo "Se ha añadido a la agenda."
    sort -k 2 -t";" $agenda
fi

输出

这是输出,但有一个错误。例如,在我的地址簿中,我有:

sergio;damico;[email protected]

我替换为

marco rossi

我希望有

marco;rossi;[email protected]

并不是

marco;rossi;[email protected]

答案1

有几种方法可以通过更改 sed 行来解决此问题:

选项1(推荐):匹配$name$delimiter而不是仅仅匹配$name。您的分隔符是';',因此将其添加到匹配并替换字符串中:

sed -e "s/${nom};/${1};/g" 

选项 2(不推荐单独使用): /g说匹配全部一行上的实例${nom}- 当您只想匹配第一个时 - 删除 g:

sed -e "s/${nom}/${1}/" 

选项 3(使用两者更准确):

sed -e "s/${nom};/${1};/" 

最后,由于您正在使用,因此您正在创建临时文件并移动它们sed -e。您可以使用 sed 直接编辑文件,sed -i然后使用,您不必担心创建临时文件并将它们移动到原始文件上

相关内容