구분자 색인 가져오기

구분자 색인 가져오기

아래에 설명된 구분 기호 색인을 얻고 싶습니다.

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. 존재하지 않는 문자열을 검색하면 -1결과가 나오지 않습니다.
  2. 검색하는 모든 단어가 문자열의 시작과 끝에 grep포함되어 있는지 확인하세요.^$"^word to search$"

관련 정보