2013-04-13 48 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 
相關問題