아래에 설명된 구분 기호 색인을 얻고 싶습니다.
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"
보시다시피 두 번 입니다 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$"