2010-12-14 1 views
4

바쉬의 $PS1에 적합한 문자열을 만들기 위해 svn info을 구문 분석하는 스크립트 (source)가 있습니다. 불행히도 이것은 Perl 5.8.8을 사용하고있는 하나의 시스템에서는 작동하지 않습니다 - 단지 매치 대신 모든 라인을 출력합니다. Perl 5.8.8은 다음과 같을 것입니다.Perl 5.8.8에서 대치 한 부분 만 반환합니다. (예 : Perl "p"정규식 수정 자 상당)

__svn_ps1() 
{ 
    local result=$(
     svn info 2>/dev/null | \ 
     perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p') 
    if [ -n "$result" ] 
    then 
     printf "${1:- (%s)}" $result 
    fi 
} 

5.10 펄로부터의 출력 만 공간 괄호, 지점명, 태그 명이나 trunk 중 하나와 단부 괄호를 포함한다. Perl 5.8.8 (최종 p 제외)의 출력에는 이 포함되어 있으며 svn info 출력의 각 공백으로 분리 된 부분을 괄호로 묶은 버전입니다.

가능한 해결 방법은 svnperl 명령 사이에 간단한 grep '^URL: '이 포함되어 있지만, 각 Bash 프롬프트마다이 명령이 실행되므로이를 피하기 위해 노력하고 있습니다.

+0

무엇을하려고하는지 설명 할 수 있습니까? 입력 파일과 예상되는 출력을 제공하십시오. – justintime

+0

어쩌면 나는 갇혀있는 레코드처럼 들릴지 모르지만, "입력 파일을주고 예상 한 결과를 제공하십시오." 당신은 많은 절반의 구운 해결책을 제시하고 있지만 당신이 원하는 것을 해결할 수는 없습니다. – justintime

답변

11

일치하는 줄의 출력 만 원하는 경우 -p 명령 줄 스위치를 사용하지 마십시오. 각 루프의 끝에 $_의 값을 인쇄합니다. 나는 펄 v5.8 및 V5.10에 대해 동일한 방법으로 할 거라고

perl -ne 'print if s/.../.../' 

: 당신은 -n 명령 줄 스위치 뭔가를 할 수 있습니다. $`, $& 또는 $' 개의 변수 또는 일치하는 해당 항목을 사용하지 않아서 /p 수정자가 어떤 행동을한다고 생각하는지 잘 모르겠습니다.

perlrun의 명령 줄 스위치를 읽을 수 있습니다.

+0

고마워요, 그건 그냥 일이었습니다! 나는'/ p'와 그것이 한 일을 오해했다. Perl 5.10이 모든 라인을 출력하지 못하는 것은 이상한 일입니다. – l0b0

6

perl 5.10에서 /p 스위치는 일치 항목을 ${^PREMATCH}, ${^MATCH}${^POSTMATCH}에 넣도록합니다.

게시 한 one-liner는 결코 해당 vars를 사용하지 않으므로 /p을 생략하십시오.

UPDATE : 초기 질문을 계속 시도 ...

perl -ne 's/search/replace/ and print' 

은 인쇄 라인이되는 교체가 만들어진 것이다. 참고 -n-p 스위치. 또한, 내 5.10에 -p/p 콤보를 시도하고 변경되지 않은 불일치 줄도 행복하게 인쇄합니다. 어쩌면 내가 뭔가를 놓친 ...

+0

질문의 명확성 -이 문제는 Perl에서 반환되는 것에 더 가깝습니다. – l0b0