配列から特定の文字を含まない要素を削除します。

配列から特定の文字を含まない要素を削除します。

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

関連情報