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

klo*_*lor 1 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 正则表达式完成。在这个例子中。应该用_代替

在 Bash 中:

site="www.mysite.com"
mysql_db_name= ???
Run Code Online (Sandbox Code Playgroud)

我的问题是,我不知道:

  • 如何将 $site 输入到 Perl regexp 进行替换,然后将结果分配给 $mysql_db_name 变量?

谢谢!

Dop*_*oti 8

如果你不具备用perl,tr使这个死简单:

mysql_db_name="$(echo -n "$site" | tr -C '0-9a-zA-Z_$' '_')"
Run Code Online (Sandbox Code Playgroud)


小智 6

mysql_db_name=$(printf %s\\n "$site" | perl -lpe 'y/0-9a-zA-Z$_/_/c')
Run Code Online (Sandbox Code Playgroud)

既然你已经很了解 Perl,就不需要任何解释了。

mysql_db_name=${site//[!a-zA-Z_$0-9]/_}

mysql_db_name=$(perl -se 'print y/0-9a-zA-Z$/_/cr' -- -_="$site")
Run Code Online (Sandbox Code Playgroud)