2013-04-13 49 views
0

所以我正在开发一个简单的地址簿,它很好。 它使用单个文本文件来存储其所有信息。搜索一个字符串,输出到一个数组,然后根据用户输入删除它

在一分钟我可以搜索文件的特定字符串,而不是问题。

我敢肯定,我可以根据用户输入删除一个字符串,这很容易,但我认为是额外的时髦,它将是一个整洁的想法,如果我可以抓住搜索词的输出 - 多行输出说 - 并将每个新行存储到一个数组,每个分配一个数字。 从那里用户可以指定他们想要根据他们的输入删除该行。

到目前为止,这是“删除”脚本:

ADDRESSBOOK=~/Documents/Address-Book/add_data.txt 

export ADDRESSBOOK 

echo "=============================== Delete a Record ===============================" 
echo "===============================================================================" 
echo "============ Search A Record, then delete it! Type 'exit' to exit =============" 

exit=0 
search(){ 
    while [ $exit -ne 1 ] 
    do 

     echo "Find something for me to delete" 
     echo -n "-----------------------> " 

     read searchTerm 
     if [ "$searchTerm" = "exit" ] 
     then 
      exit=1 
     else 

      searchOutput=$(grep $searchTerm*.$ $ADDRESSBOOK | sort) 

      echo "$searchOutput" 
     fi 
    done 

    exit 0 
} 

search 

地址簿自动将每个记录与/ N所以无论如何显示在新行的每个记录。

是否可以接受$ searchRecord变量并将其传递给数组?

而在我围绕着阵列环绕我的头之前,这是甚至是我想要做的最好的方法吗?

目前我正在试图沿着

if [ "$searchTerm" = "exit" ] 
then 
    exit=1 
else 

    searchOutput=$(grep $searchTerm*.$ $ADDRESSBOOK | sort) 
    echo {$searchOutput[*] '/n' } 

fi 

的“/ N”线的东西是尝试并获得记录每出现在一个新的生产线。任何建议家伙?

+0

我会用''\ n'',这是ASCII新线的适当的代表开始。 – Rubens

回答

0
while read -p 'Find something for me to delete> ' searchTerm 
    [[ $searchTerm != 'exit' ]] do readarray -t searchOutput < <(grep -i -w "$searchTerm" "$ADDRESSBOOK" | sort) 



     if ((${#searchOutput[@]}>0)); then 

     PS3="Select line to delete: " 

      select line in "${searchOutput[@]}"; do 

      [[ -z $line ]] && break 

      line=$(fgrep -nx "$line" "$ADDRESSBOOK") 



     sed -i ${line%%:*}d "$ADDRESSBOOK" 

       echo "Deleting line" $line 
      done 
     elif [ $searchTerm = "exit" ] 
     then 
     exit=1 
      else 
       echo "------------- Could Not Find > " $searchTerm 
     exit=1 
       fi 
done 
exit 0 
} 
+0

这真的很难读......考虑到在这里粘贴代码的时候有更少的随机缩进,因为我确信有些人被这个吓到了,所以当你的代码实际上可读时你可能会得到更多的帮助。 –

0

试着这么做:

l=$(grep $searchTerm $ADDRESSBOOK | \ 
    sort | { \ 
     n=0; \ 
     while read a; \ 
      do echo "searchOutput[$n]=\"$a\";" ; \ 
       n=$((n + 1)) ; \ 
      done; \ 
    }) 
eval $l 

for line in "${searchOutput[@]}" 
do 
    echo $line 
done 
相关问题