这与 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/