sed 大文字と小文字を区別しない一致が機能しない

sed 大文字と小文字を区別しない一致が機能しない

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_01RED1.NAMERED1.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使用できます。perlawk

$ 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

関連情報