2013-08-05 3 views
0

"5 : 16 : 51 : 209 | INFO |"다음의 메시지가 "마커"로 시작하는지 확인하려고합니다. timestamp 후에 문자열 "| ICD"를 추가해야합니다. 나는이 정규식을 시도했다 "Markerprocedure 자석 | | 정보 209 : 05 : 16 : 51"문자열이 주어진 문자열로 시작하는지 확인하십시오.

있지만 작동하지

입력입니다. 제발 도와주세요. 당신이 확인하려는 날 것으로 보인다 무엇

if ($lines[$i] =~ m/(\d{2}:\d{2}:\d{2}:\d{3})|(\w+)|^Marker/) 
{ 

    $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(.*)/$1|ICD$2/ ; 

} 

답변

2
I am trying to check if message after "5:16:51:209|INFO| " starts with "Marker" 

Marker바로 그 시작 있는지 여부를 확인하기 때문에5:16:51:209|INFO| 그렇게는 ^ 정규식 문자를 사용하는 것이 정확하지 않은 다음 여부 문자열은 그 위치에서 발생합니다 (물론, 그렇지 않습니다). 따라서 ^ 문자를 제거하면 Perl은 Marker이 바로 다음에 있는지 확인합니다.

또한 문자를 \|과 같이 이스케이프 처리해야 정규식에서 대체 명령으로 취급되지 않습니다. 그런 다음 테스트를 단일 대체 명령 대체 할 수

if ($lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/) 
{ 
    # Line contained "Marker" and "|ICD" inserted 
} 

예 :

$ echo '15:16:51:209|INFO|Marker blah' | perl -ple 's/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/' 

출력은 다음과 같습니다

15:16:51:209|ICD|INFO|Marker blah 

편집 : @Prix는 지적했다 시간 소인이 문자열의 시작 부분에 표시 될 예정이면 ^ 시작 마커는 정규식의 시작 부분에 있어야한다는 의견 문자열 (및 성능)의 다른 부분에서 실수로 일치 방지 :

s/^(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/ 
    ↑ 
    Use^here to anchor the search to the beginning of the string. 
+0

사실은'그가 잘못된 장소에 그것을 사용하고 있지만 ^'가에 있어야 사용하는 올바른 것은/^'로'시작 그는 문자열 중간과 같은 타임 스탬프와 일치하는 다른 것을 찾기를 원하지 않을 수 있습니다. – Prix

+0

OP는 타임 스탬프가 문자열의 시작 부분에 있어야한다는 것을 절대로 말하지 않습니다. 따라서 그 기준에'^'가 없어야합니다. 그러나 실제로는 경기가 경기장 시작 부분에서만 이루어져야하므로 내 대답을 편집 할 가능성이 높습니다. –

+0

네, 맞습니다만, 그가 제공 한 견본 입력에 근거하고 있습니다. OP가 그걸 지우길 바랄지라도 시간 소인으로 시작합니다. 또한 그의 샘플 문자열에 따르면 초기 숫자 앞에 공백이 있습니다. – Prix

관련 문제