这与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中运行这个大写转换器?
答案 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本身做你想要的。