sed(또는 유사한 항목)와 일치하는 구성 매개변수를 어떻게 찾을 수 있나요?

sed(또는 유사한 항목)와 일치하는 구성 매개변수를 어떻게 찾을 수 있나요?

저는 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 @listsomething$_루프를 목록 값의 변수 로 실행합니다. 목록 컨텍스트(내부적으로 ) m{...}에서 캡처된 패턴 목록을 반환합니다 . 매개변수 없이 인쇄합니다 .(...)print$_

답변2

노력하다

grep -oP <your_pattern> <your_file>

정규식을 Perl로 해석하고 -P일치 하는 것만 반환하도록 하세요 .grep-o

편집: grep게으른 수량자를 반드시 지원할 필요는 없으므로 URL이 여러 줄에 걸쳐 실행되는 것을 원하지 않으면 /s수정자 없이 탐욕스러운 수량자를 사용합니다.

관련 정보