我想使用 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
然后使用,您不必担心创建临时文件并将它们移动到原始文件上