我试图匹配 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
变量是动态的,您可以使用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