我在 $site 变量中有一个类似“www.mysite.com”的字符串。在 MySQL 中,不带引号的标识符中允许的字符是(更多信息:https://dev.mysql.com/doc/refman/5.7/en/identifiers.html):
- ASCII:[0-9,az,AZ$_](基本拉丁字母、数字 0-9、美元、下划线)
- 扩展:U+0080 .. U+FFFF
然而对我来说,现在足以执行这个正则表达式:'s/[^0-9a-zA-Z\$]//G'
我想替换 $site 的无效字符,使有效的架构对象名称(如数据库名称)带有下划线。应该使用 Perl 正则表达式进行替换。在此示例中,.应替换为 _
在重击中:
site="www.mysite.com"
mysql_db_name= ???
我的问题是,我不知道:
- 如何将 $site 输入到 Perl regexp 中进行替换,然后将结果分配给 $mysql_db_name 变量?
谢谢!
答案1
如果你不这样做有使用 perl,tr
使这变得非常简单:
mysql_db_name="$(echo -n "$site" | tr -C '0-9a-zA-Z_$' '_')"
答案2
mysql_db_name=$(printf %s\\n "$site" | perl -lpe 'y/0-9a-zA-Z$_/_/c')
现在既然你已经很了解 Perl,就不需要任何解释了。
mysql_db_name=${site//[!a-zA-Z_$0-9]/_}
mysql_db_name=$(perl -se 'print y/0-9a-zA-Z$/_/cr' -- -_="$site")
答案3
如果你在 bash 中,并且要编辑的值已经在变量中,那么为什么你需要使用 awk、perl、sed 或任何 bash 可以自己完成的东西:
$ site="www.mysite.com"
$ mysql_db_name="${site//[^a-zA-Z0-9$]/_}"
$ echo "$mysql_db_name"
www_mysite_com
虽然 bash 模式(不是正则表达式)的语法与 Perl 正则表达式不同,但里面的内容括号表达式。相当于两种选择:匹配一提供的列表中的字符。