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正規表現に入力し、結果を$ 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正規表現とは異なりますが、内容は角かっこ表現。2つの選択肢と同じ:一致一つ提供されたリストの文字です。

関連情報