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.
사실은'그가 잘못된 장소에 그것을 사용하고 있지만 ^'가에 있어야 사용하는 올바른 것은/^'로'시작 그는 문자열 중간과 같은 타임 스탬프와 일치하는 다른 것을 찾기를 원하지 않을 수 있습니다. – Prix
OP는 타임 스탬프가 문자열의 시작 부분에 있어야한다는 것을 절대로 말하지 않습니다. 따라서 그 기준에'^'가 없어야합니다. 그러나 실제로는 경기가 경기장 시작 부분에서만 이루어져야하므로 내 대답을 편집 할 가능성이 높습니다. –
네, 맞습니다만, 그가 제공 한 견본 입력에 근거하고 있습니다. OP가 그걸 지우길 바랄지라도 시간 소인으로 시작합니다. 또한 그의 샘플 문자열에 따르면 초기 숫자 앞에 공백이 있습니다. – Prix