2015-02-09 118 views
0

这与this question相反。一个MYSQL脚本将列名转换为大写

我正在从一个lowercase_names数据库服务器迁移到一个区分大小写的设置,其中我需要表和列的大写字母名称(它们在代码中以大写形式存储)。

我已阅读answer,使用sed是将名称替换为小写的好方法,这不是我想要的。

因此,从正则表达式

s/`\(\w\+\)`/\L&/g 

开始我把它改成

s/`\(\w\+\)`/\U&/g 

以为这样就可以转换为大写。然后,我已经试过进口大写的DDL

mysqldump --skip-triggers --compact --no-create-info -hxx -uxx -pxx source | sed s/`\(\w\+\)`/\U&/g | mysql -hxx -uxx -pxx target 

后运行这一个班轮但是失败

-bash: /g: No such file or directory 
-bash: (w+): command not found 
sed: -e expression #1, char 4: unterminated `s' command 

我怎样才能运行这个猛砸大写转换器?

回答

2

您需要使用您的左右sed命令单引号,否则某些部件会被外壳程序解释:

mysqldump ... | sed 's/`\(\w\+\)`/\U&/g' 

如果你有兴趣,该&被解释为运行指令该命令在后台(因此/g被作为单独的命令处理),反引号创建一个子shell。转义括号意味着它们按字面解释。转义\w\+在此情况下不起作用,因此运行命令(w+)

正如你在替换字符串中使用&得到充分匹配patttern而不是特定的捕获组(如\1),你也可以删除括号as pointed out by Avinash

mysqldump ... | sed 's/`\w\+`/\U&/g' 

针对您的对其他数据的影响受到影响,这是一个非常广泛的正则表达式(捕获反引号内的任何单词字符),因此可以应用于很多事情。根据您的数据大小,您可能会喜欢使用sed -n 's/`\w\+`/\U&/gp',这将向您显示受替换影响的部分。使用这些信息你可能会改变你的正则表达式。但是,很可能有更好的方法在SQL本身中执行所需的操作。

+0

Hahahahahahahahaha。真是微不足道!现在很好用! – 2015-02-09 14:06:22

+1

你不需要使用捕获组。 – 2015-02-09 14:07:13

+0

其实现在我认为它的Shellshock漏洞使用了这样的括号语法 – 2015-02-09 14:08:25