2014-11-05 4 views
1

나는이 정규식 나오지 WRT의 행동을 이해하려고 노력하고 있어요 :
sed -n "s/.*Directory \([^>]*\)>/\1/p" /etc/apache2/sites-enabled/*이상한 나오지 욕심 정규식 행동

목표는 여기 아파치의 모든 활성화 된 가상 호스트의 웹 루트의 경로를 나열하는 것입니다. /var/www/my_site

그러나 sed -n "s/.*Directory \([^>]*\)/\1/p" <<< "<Directory /var/www/my_site>"의 결과는 다음과 같습니다 : /var/www/my_site>

나는 차이가 존재하는 것을 알고 예상대로
sed -n "s/.*Directory \([^>]*\)>/\1/p" <<< "<Directory /var/www/my_site>"입니다 :

이상한 것은이 샘플 명령의 결과가 있다는 것입니다 >입니다. 문제는 올바른 출력을 얻으려면 >을 추가해야하는 이유는 무엇입니까? [^>]*은 모든 것을 일치시킬 수 있어야하며 >에서 중지해야하므로 괄호 안에 캡처되지 않습니다.

왜 '>'문자가 첫 번째 명령에 포착되었는지, 두 번째 명령에 포착 된 것인지 이해할 수 없습니다. [^>]

첫 번째 줄에
+0

첫 번째 명령에는 검색어에'> '이 있지만 두 번째 명령에는 검색어가 없습니다. – anubhava

+1

나는 그것을 안다. 질문은 올바른 출력을 얻기 위해'>'를 추가해야하는 이유는 무엇입니까? '[^>] *'는 모든 것을 매치 할 수 있어야하고'> '에서 멈추어야하므로 괄호 안에 캡쳐되지 않습니다. – mak

+0

두 번째 명령에서'>'와 일치하지 않으므로 대체에 포함되지 않고 그대로 유지됩니다. '([^>] * \)를 그 자체로 바꾸고 나머지 줄은 변경되지 않습니다.괄호 안에 무엇을 넣고 싶다면 대괄호 밖의 명령 끝에'. * '를 추가하십시오. –

답변

2

, 당신이 당신의 그룹 1에있는 것들에 의해 전체 문자열 교체 ... 캡처 괄호에서 '>'제외해야 : 그래서 당신이있어 : 의/var/www /에서 당신이 <Directory......site참고가 아닌 전체 문자열을 교체, 2 선에서 끝 >

을 my_site 것은이 같은 캡처 그룹하지 않았다. 그러나 엔딩 >은 그대로 유지되었다. 그래서 출력에서 ​​볼 수 있습니다.

다른 예 : 치환 나머지 문자열 그대로 것 인 whatever thisfoooooowhatever this : 위 예에서

$ sed -n "s/fo*\([^o]*\)/\1/p" <<< "foooooowhatever this ooo will leave behind" 
whatever this ooo will leave behind 

는 교체 대상이다.

+0

의미가 있습니다. Sed는 명시 적으로 정규 표현식에 넣지 않으면 정규 표현식이 일치하지 않기 때문에'>'(s /// 명령으로 요청했을 때)를 덮어 쓰지 않습니다. – mak

+0

네, 라벨 홀드를 \\ (\\)에두고 다른 홀딩 정규 표현식을 \ 1과 같이 라벨을 붙인 홀드를 바꾸고 참조 할 때 사라지는 모든 것의 외측에 다른 정규 표현식을 넣으면 어떻게 될까요? –

1

첫 번째 명령의 검색어는 >이지만 두 번째 명령의 검색어는 >입니다.

sed -n "s/.*Directory \([^>]*\)>/\1/p" 

:

sed -n "s/.*Directory \([^>]*\)/\1/p" 

는 또한 첫 번째 명령 참고 :

[^>]*>이 때문에 > 당신의 두번째 나오지 명령에 남아 (> 제외) 일치 전에 모든 일치 \1>을 캡처하고 있지 않지만 sed 명령은이를 대체하지 않고 있습니다.

+1

업데이트 된 답변보기, 이미했습니다. 귀하의 의견에 대답 즉 즉'[^>] *'는'> '두 명령에 모두 발견되기 전에 모든 것을 일치시킵니다. 그래서'\ 1'은'>'바로 앞의 모든 텍스트입니다. 첫 번째 명령에서만'> '을 가지므로 최종 출력에서는 생략됩니다. – anubhava

+1

예를 제공했기 때문에 켄트의 대답을 받아 들였고 실제로 그는 내 이해에 더 분명했습니다. 그가 가지고있는 담당자의 거의 3 배가 넘는 사람이 있기 때문에 쿠키를 갖게 해준 것에 대해 나를 화나게하지 마십시오. – mak

+0

@mak : 전혀 아닙니다. 답을 수락하는 것이 항상 OP의 특권입니다. – anubhava