저는 php(및 이와 유사한) 명령을 매우 잘 사용 preg_match
하고 정규 표현식을 사용하는 데는 매우 능숙하지만 sed
.
저는 두 개의 쉘 스크립트를 작업 중이며 구성 파일에서 일부 변수를 추출할 수 있기를 원합니다.
첫 번째 파일
첫 번째 파일은 .htaccess
파일이고 다음과 같은 블록에 있는 URL을 가져오고 싶습니다.
RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]
이 파일의 구문은 .htaccess
매우 규칙적이므로 다음 #.*(http.*?)\$#is
과 유사한 패턴을 사용해야 할 것 같습니다.
- 정규식
- #으로 구분
- http 앞에는 0개 이상의 문자가 옵니다.
- 탐욕스럽지 않은 표기법을 사용하여 http에서 캡처를 시작하시겠습니까?
- 실제 달러 기호가 나타날 때까지 캡처를 계속합니다(이스케이프).
- 일치는 대소문자를 구분하지 않습니다.
- 공백/줄바꿈 무시
sed
일치하는 경우 대괄호 안의 부분을 가져오고, 일치하지 않는 경우 아무것도(빈 문자열) 가져오지 않으려면 이와 같은 명령과 함께 정규식을 어떻게 사용할 수 있습니까 ?
sed
내가 익숙한 PHP의 PCRE 외에 다른 명령을 사용하는 것이 더 나을까요?
두 번째 파일
두 번째 파일은 파일이라는 점에서 약간 다르므로 이를 구문 분석하는 데 .ini
사용하는 쉘 마법이 있는지 궁금합니다 . bash
내가 원하는 블록은 다음과 같습니다.
[Database]
database = mysql://user:password@localhost/database
PHP와 정규 표현식을 사용한다면 다음과 같이 할 것입니다:
#\s+database\s*=\s*mysql://([\:]+):([\@]+)@([\/]+)/(.*?)\s+#is
PHP에는 .ini 파서가 있지만 PHP 스크립트가 아닌 쉘/bash 스크립트가 되기를 원합니다.
이 정규식을 사용하여 데이터베이스 연결 자격 증명을 얻으려면 어떻게 해야 합니까?
답변1
Perl과 유사한 정규 표현식을 사용하려면 Perl(비포함 Unices의 99%에서 발견됨)을 사용하면 어떨까요?
좋다:
perl -lne 'print for /(http.*?)\$/'
perl -lne 'print for m{database\s*=\s*mysql://([^:@]+):([^@]+)@([^/]+)/(\S+)}i'
/.../
예의 약어입니다 m/.../
. m/.../
이외의 문자 /
및 m{...}
와 같은 문자 쌍이 허용 됩니다 m(...)
.
something for @list
something
$_
루프를 목록 값의 변수 로 실행합니다. 목록 컨텍스트(내부적으로 ) m{...}
에서 캡처된 패턴 목록을 반환합니다 . 매개변수 없이 인쇄합니다 .(...)
print
$_
답변2
노력하다
grep -oP <your_pattern> <your_file>
정규식을 Perl로 해석하고 -P
일치 하는 것만 반환하도록 하세요 .grep
-o
편집: grep
게으른 수량자를 반드시 지원할 필요는 없으므로 URL이 여러 줄에 걸쳐 실행되는 것을 원하지 않으면 /s
수정자 없이 탐욕스러운 수량자를 사용합니다.