搜索字符串,将其输出到数组,然后根据用户输入删除它

时间:2013-04-13 14:33:00

标签: arrays string bash shell

所以我正在开发一个简单的地址簿,并且进展顺利。 它使用单个文本文件来存储其所有信息。

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

我很确定我可以根据用户输入删除一个字符串,这很容易,但我想更多的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并将每个记录显示在新行上。有什么建议吗?

2 个答案:

答案 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
}