2012-06-12 3 views
1

나는 폴더에 .LOG 및 _log 같은 파일을 얻고, 내가 _log있는 파일을 찾을 수 /*.log$/하지만없는 가진 파일을 .log를 선택할 수 있어요. 패턴 매칭 로그 파일

지정된 폴더에서 파일의 두 유형을 취할 것입니다 정규식 패턴이 필요합니다.

답변

3

귀하의 질문에 'perl'과 'linux'태그가 지정되었습니다. 여기서는 Perl 스타일의 정규 표현식에 대해 이야기하고 있다고 가정하겠습니다. 예를 들어 스 니펫에 표시되는 것처럼 보입니다.

*. 순서는 실수이다.

당신이 원하는 것을 집중 해 봅시다. 점으로 끝나는 파일 이름과 문자 '문자'가 일치하도록하려는 경우 밑줄로 끝나는 파일 이름과 문자 'log'가 일치하도록하려는 경우도 있습니다. 마지막 점이나 밑줄 앞에 올 수있는 "무엇이든"에 대해서는 정말로 염려하지 않아야합니다. 따라서 정규 표현식은 아마도 다음과 같이 작성하는 것이 더 낫습니다.

/[._]log$/ 

도트 스타가 신경 쓸 필요가 없습니다. 이 상황에서는 도움이되지 않습니다.

리터럴 문자 'log'앞에 선택적으로 정수 시퀀스 (질문에 언급되지 않았지만 후속 조치 의견 중 하나에서 논의 됨)가 뒤 따르는 파일과 패턴을 일치 시키려면 패턴을 쓸 수 있습니다 같은 : 여기

/[._]log\d*$/ 

'스타' 도움이된다; 그것은 'g'와 문자열의 끝 사이에 끼워진 0 개 이상의 숫자를 허용합니다.

+0

감사를 골라 /.*[._]log$/하지만 난 .log1, .log2와 _log1, _log2와 같은 같은 파일을 얻을 수 있습니다 등등 –

+0

다음 내 업데이 트를 참조하십시오 (그리고 당신은 원래의 질문을 언급해야 그것을 업데이 트해야합니다). – DavidO

+1

좋은 대답입니다. 받아 들여야합니다. – aglassman

-1

정규 표현식 /.*[._]log$/를 사용합니다. 합니다 (* 그것이 가정 무엇제로 또는-이상으로 일치하는 말을하지 않기 때문에) /*.log$/ 법적 정규 표현식하지 않습니다 - 난

은 첫 번째 경우는 일을 놀라게했다. 현재 결과를 다시 확인하십시오.

+0

감사합니다. sarnold 첫 번째 결과는 작동했지만 잘못 확인했습니다. –

+0

sarnold 그리고 한 가지 더이 정규식 다비 _log1의 or.log1 같은 파일과 유사 –

1

나는 완전히 다비의 솔루션 (upvoting로) 동의하지만, 일반적으로 더 의미가 있습니다, 그리고

my $dir = "/path/here"; 

my @log_files = grep { /[\._]log\d*$/ } glob("$dir/*"); 

print join "\n", @log_files; 

이 잡을 것 특정 디렉토리에서 파일의 목록을 가져올 글로브()를 사용, 가독성을 증가

foo.log 
foo_log 
foo.log1 
foo_log22 
+1

이 질문의 범위를 벗어난 것 같습니다. – aglassman