所以我正在开发一个简单的地址簿,并且进展顺利。 它使用单个文本文件来存储其所有信息。
在那一刻我可以搜索特定字符串的文件,而不是问题。
我很确定我可以根据用户输入删除一个字符串,这很容易,但我想更多的snazziness它会是 如果我能抓住搜索词的输出 - 多行输出说 - 并将每个新行存储到一个数组中,每个都分配一个数字,这是一个很好的想法。 从那里,用户可以指定他们想根据他们的输入删除该行。
到目前为止,这是'删除'脚本:
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'是TRY并将每个记录显示在新行上。有什么建议吗?
答案 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
答案 1 :(得分: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
}