SQLファイル内の単語(実際にはテーブルエイリアス)を一致させ、その列名を別の名前に変更しようとします。
sed -ie s/$alias.${act_cols[a]}/$alias.$third_ele/gI $sql_file
問題は、I
大文字と小文字を区別しない一致オプションが機能しないようです。これには、$alias
「red1」の値が含まれており、「NAME」と仮定できる列の配列であり、代替列$act_cols
名「COLUMN_01」が含まれています。act_cols[a]
$third_ele
ファイルの一部の場所にはエイリアスRED1(大文字)が含まれており、その場合は列名は変更されません。
たとえば、次のようred1.NAME
に正しく置き換えられましたが、置き換えられませんでした。red1.COLUMN_01
RED1.NAME
RED1.COLUMN_01
どんな助けでも大変感謝します。ありがとうございます。
答え1
私はGNU sedにのみI / i修飾子があると思います。
ただ、あなたのsedがI / iをサポートしていない場合は、以下のように大文字と小文字の区別を避けるために使用できます。
alias
以下のように変数を割り当て、次のように使用しますsed
。
$ alias="[Rr][Ee][Dd]1"
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | sed -e "s/\($alias\).NAME/\1.COLUMN1/g"
RED1.COLUMN1 and red1.COLUMN1 and red1 and Red1
または変数が動的である場合は、次のようにまたはをalias
使用できます。perl
awk
$ alias="red1"
$ act_cols="NAME"
$ third_ele="COLUMN1"
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | perl -pe "s/($alias).$act_cols/\1.$third_ele/gi"
RED1.COLUMN1 and red1.COLUMN1 and red1 and Red1
awkを使用してください:
$ echo $alias
red1
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | awk -v value=$alias 'BEGIN {IGNORECASE = 1} { gsub(value".NAME",value".COLUMN1");print }'
red1.COLUMN1 and red1.COLUMN1 and red1 and Red1