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 정규식과 다르지만 내용은대괄호 표현.두 가지 선택과 동일: 일치하나제공된 목록의 문자입니다.

관련 정보