用于将列名转换为大写的MYSQL脚本

时间:2015-02-09 14:00:42

标签: mysql regex bash sed

这与this question相反。

我正在从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

如何在Bash中运行这个大写转换器?

1 个答案:

答案 0 :(得分:2)

你需要在你的sed命令周围使用单引号,否则shell会解释一些部分:

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

如果您感兴趣,&被解释为在后台运行命令的指令(因此/g作为单独的命令处理)并且反引号创建子shell 。转义括号表示它们按字面解释。转义\w\+在此上下文中无效,因此运行命令(w+)

当您在替换字符串中使用&来获取完全匹配的模式而不是特定的捕获组(例如\1)时,您也可以删除括号{{3} }:

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

为了回应您对其他数据受到影响的担忧,它是一个非常广泛的正则表达式(捕获反引号中的任何单词字符),因此可以应用于很多事情。根据您的数据大小,您可能希望使用sed -n 's/`\w\+`/\U&/gp',它会显示受替换影响的部分。使用该信息,您可以更改正则表达式。但是,有可能有更好的方法在SQL本身做你想要的。