배열에서 특정 문자를 포함하지 않는 요소를 제거합니다.

배열에서 특정 문자를 포함하지 않는 요소를 제거합니다.

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

관련 정보