Awk: RegExp 패턴 일치의 실제 값 추출

Awk: RegExp 패턴 일치의 실제 값 추출

다음 awk 코드 섹션에는 파일 이름과 전체 Linux 경로가 포함되어 있으며, 여기에는 날짜 file유형 디렉터리로 YYMMDD가 포함될 수 있습니다.backup-YYMMDD

isDate[file]즉, YYMMDD를 할당하고 싶습니다 isDate[file]=YYMMDD.

어떻게 해야 하나요?

for (file in files) {
        if ( file ~ /(^|\/)(library|labs data|current)(\/|$)/ ) {
           isKeep[file]
        }
        else if ( file ~ /(^|\/)(backup-[0-2][0-9][0-1][0-9][0-3][0-9])(\/|$)/ ) {
            isDate[file]
        }
        else {
            isDelete[file]
        }
}

답변1

GNU에는 패턴으로 특징지어지는 문자열 구성 요소의 실제 값을 추출할 수 있는 명령이 awk있습니다 . match그래서 당신은 사용할 수 있습니다

match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats);
isDate[file]=pats[1]

else if ....프로그램 의 일부입니다. (배열) 변수는 다음부터 시작하여 pats모든 RegExp (...)의 문자열에 포함된 모든 하위 표현식 으로 채워집니다.색인 1( pats[0]실제 값이 됩니다.모두표현하다). 그룹화된( backup-YYMMDD부분적으로) 하나의 하위 표현식만 있으므로 pats[1]찾고 있는 내용이 포함됩니다.

아니면 그냥 시도해 볼 수도 있습니다

...
   else if (match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats)==1) {
      isDate[file]=pats[1]
   }
...

물론 이 접근 방식은 다음 사항에 의존합니다.단 하나패턴의 경로 구성요소를 포함합니다 backup-YYMMDD.

편집하다(OP의 코멘트, @macxpat)

"^[[:print:]] ... $"이 답변에서는 정규식을 지정하기 위해 문자열 상수( )를 사용했습니다 . 그러나 다음과 같이GNU Awk 사용자 가이드,정규식 상수로 지정하는 것이 더 깔끔하고 효율적입니다.. 그러므로 활용하는 것이 더 좋습니다.

match(file,/^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$/,pats)

위의 예에서!

관련 정보