$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つの選択肢と同じ:一致一つ提供されたリストの文字です。