c_arr
테이블 별칭이 있는 테이블 열이 포함된 배열이 있습니다. 그러나 배열에는 실제로 열이 아닌 일부 요소가 있으므로 형식이 없습니다 alias.column_name
.
포함되지 않은 항목을 제거해야 합니다 .
. 어떻게 해야 합니까?
배열은 다음 명령문을 사용하여 생성됩니다.
c_arr=($echo $(grep -io "\b$alias.\w[a-zA-Z_0-9]*" $output_file))
위 줄에는 또 다른 문제가 있습니다. $alias.
별칭 뒤에 점을 사용하여 검색하더라도 배열은 c_arr
점이 포함되지 않은 다른 값을 가져옵니다. 배열의 예시 값은 다음과 같습니다.
cab.SYSTEM_NAME
cab.row_id
cab.name
cabxa
cabxa
cab.x_sys_name
cab.status_Cd
cab.LAST_UPD
고쳐 쓰다:
이제 당면한 문제는 c_arr
배열에 점 요소와 점이 아닌 요소가 있는 경우 배열에서 문자를 포함하지 않는 요소를 제거하는 방법입니다. .
내용은 c_arr
다음과 같습니다.
cab.SYSTEM_NAME
cab.row_id
cab.name
cabxa
cabxa
cab.x_sys_name
cab.status_Cd
cab.LAST_UPD
원하는 출력은 다음과 같습니다.
cab.SYSTEM_NAME
cab.row_id
cab.name
cab.x_sys_name
cab.status_Cd
cab.LAST_UPD
답변1
그러면 다음과 같은 작업을 수행할 수 있습니다.
c_arr=$(echo $(grep -i "${alias}\." $output_file))
Bill Jetzer가 언급했듯이 정규식에서 점을 이스케이프 처리해야 하기 때문입니다.
점이 있는 모든 항목이 유효하다고 확신하는 경우 다음을 수행할 수도 있습니다.
c_arr=$(echo $(grep -i \. $output_file))
답변2
"Bash 배열에서 특정 문자를 포함하지 않는 요소를 제거하는 방법"이라는 질문에 대한 구체적인 답변입니다. 이는 Stéphane Chazelas의 답변과 구조가 매우 유사합니다. 배열이 있고 이를 잘라내고 싶다면 다음과 같이 할 수 있습니다.
$ list=(cab.row_id cab.name cabxa cabxa cab.x_sys_name)
$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cabxa
cabxa
cab.x_sys_name
$ # vvvv THIS ANSWERS THE QUESTION vvvv
$ IFS=$'\n' readarray -t list < <(printf "%s\n" ${list[@]} | grep '\.')
$ # ^^^^ THIS ANSWERS THE QUESTION ^^^^
$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cab.x_sys_name
이는 요소에 a가 포함되어 있지 않다고 가정하므로 \n
구분 기호로 사용할 수 있습니다.
약간의 접선: 다음을 사용하여 unset
배열에서 특정 요소를 제거 할 수 있습니다.아니요모든 후속 요소가 배열 인덱스 값만큼 이동하도록 합니다.
$ list=(idx0 idx1 idx2 idx3 idx4)
$ printf "%s\n" ${list[@]}
idx0
idx1
idx2
idx3
idx4
$ unset list[2]
$ printf "%s\n" ${list[@]}
idx0
idx1
idx3
idx4
$ for x in ${list[@]}; do echo $x; done
idx0
idx1
idx3
idx4
$ for i in $(seq 0 4); do echo "$i: ${list[$i]}"; done
0: idx0
1: idx1
2:
3: idx3
4: idx4
답변3
.
단일 문자와 일치하는 정규식 연산자입니다.
원하는 곳은 다음과 같습니다.
readarray -t c_arr < <(LC_ALL=C grep -iPo "\b\Q$alias\E\.\w+")
( $alias
포함되지 않고 지원한다고 \E
가정 합니다 (이것은 GNU 확장이므로 이미 지원되므로 아마도 지원될 것입니다 )).grep
-P
-o
-P