mysql - 将列名转换为大写的 MYSQL 脚本

标签 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 中运行这个大写转换器?

最佳答案

您需要在 sed 命令周围使用单引号,否则某些部分将由 shell 解释:

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

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

当您使用 & 时在替换字符串中获取完全匹配的模式而不是特定的捕获组(例如 \1 ),您还可以删除括号 as pointed out by Avinash :

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

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

关于mysql - 将列名转换为大写的 MYSQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28411506/

相关文章:

php - PDO 插入动态字段

PHP 提交输入 Foreach() ID

python - 正则表达式匹配列表中的项目 + 尾随 N 个数字 (Python)

python - 在 bash for 循环中组合 python 脚本时出错

linux - 有没有办法检查我的所有 shell 用户是否更改了密码

linux - Bash 别名在文件名中创建具有当前时间戳的文件

mysql - SQL比较操作后的两个日期

python - pip install MySQL-python 出错

C++ TR1 正则表达式不可用

python - 正则表达式返回 true 且日文字符不正确