以下に説明する区切り文字のインデックスを取得したいと思います。
t="name,address,gender,phone"
区切り文字はカンマであり、文字列からアドレスを検索したい2を返すことができます。
答え1
ソリューション1
これを使用するときは、bash
文字列を"name,address,gender,phone"
配列に割り当てる必要があります。また、文字列のインデックスを取得する関数を作成する必要があります。
配列に文字列を割り当てます。
readarray -t array <<< "$(tr ',' $'\n' <<< 'name,address,gender,phone')"
インデックスを取得する関数:
getIndexOf () {
local index
index=-1
for (( i = 0; i < "${#array[@]}"; i++ )); do
if [[ $1 = ${array[$i]} ]];then
index=$[ i + 1]
break
fi
done
echo $index
}
配列変数名に注意してください。 getIndexOf関数では配列変数を「array」と呼ぶので、「read -r -a array」を使用するときは変数も「array」と呼ぶ必要があります。
getIndexOf関数の使い方:
索引を取得するには、address
次のコマンドを使用する必要があります。
getIndexOf address
#Output:
2
存在しない値を指定すると、次のようになります-1
。
getIndexOf fuzz
#Output:
-1
メモ:この機能は独自のプロジェクトでのみ使用できます。したがって、配列がある場合は見てわかるように
"name,address,gender,phone,name"
2回ですname
。したがって、この場合、関数は最初の項目インデックスを返します1
。
ソリューション2
これを使用してgrep -n
特定のアイテムのインデックスを取得できます。まず、上記のコードに示すように、文字列を配列に割り当てる必要があります。
readarray -t array <<< "$(tr ',' $'\n' <<< 'name,address,gender,phone,Some name,phone' )"
次のようにすると、printf
すべてのgrep -n
値のインデックスを取得できます。
「名前」インデックスを取得します。
printf "%s\n" "${array[@]}" | grep -n "^name$"
#Output
1:name
「特定名」のインデックスを取得します。
printf "%s\n" "${array[@]}" | grep -n "^Some name$"
#Output:
5:Some name
「電話」インデックスを取得します。
printf "%s\n" "${array[@]}" | grep -n "^phone$"
#Output
4:phone
6:phone
一致する文字列(4:電話)ではなくインデックスのみを取得するには、パイプのcut -d : -f1
末尾に次のものを使用する必要があります。
printf "%s\n" "${array[@]}" | grep -n "^phone$" | cut -d : -f1
#Output
4
6
メモ:
- 存在しない文字列を検索しても
-1
結果は出ません。 - 検索するすべての単語が文字列の先頭と末尾に
grep
含まれていることを確認してください。^
$
"^word to search$"