sed 不区分大小写的匹配不起作用

sed 不区分大小写的匹配不起作用

我试图匹配 sql 文件中的一个单词(实际上是表别名),并将其列名替换为不同的列名。

sed -ie s/$alias.${act_cols[a]}/$alias.$third_ele/gI $sql_file

问题是I不区分大小写的匹配选项似乎不起作用。这里$alias包含值“red1”,$act_cols是一个列数组,act_cols[a]我们可以假设该值为“NAME”,并$third_ele包含替换列名称“COLUMN_01”。

该文件在某些​​地方包含别名 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变量是动态的,您可以使用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

相关内容