如何使用 Perl 将无效字符替换为下划线?

如何使用 Perl 将无效字符替换为下划线?

我在 $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 正则表达式不同,但里面的内容括号表达式。相当于两种选择:匹配提供的列表中的字符。

相关内容