3~4개의 숫자를 찾는 정규 표현식

3~4개의 숫자를 찾는 정규 표현식

그래서 50개가 넘는 단어가 있는데 그 안에 있는 숫자를 일치시켜야 합니다. 이 숫자는 3자리 또는 4자리일 수 있습니다. 모든 것을 시도했지만 아무것도 작동하지 않는 것 같습니다(이 숫자를 패턴으로 기억해야 합니다). 내 시도:

'/\(.*\)\([0-9][0-9]?[0-9][0-9]\)\(.*\)/'
'/\(.*\)\([0-9]\{3,4\}\)\(.*\)/'
'/\(.*\)\(([0-9][0-9][0-9][0-9]|[0-9][0-9][0-9])\)\(.*\)/'
...

항상 3개의 숫자 또는 전체 단어만 일치합니다.

입력하다:

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK

기억해야 할 패턴:

1844
1959
1940
225
1943

답변1

이를 수행하는 방법에는 여러 가지가 있습니다. 다음 명령은 각 입력 줄에 하나의 숫자만 있을 수 있다고 가정합니다. 이 파일을 테스트로 사용하고 있습니다.

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK
  1. sed

    $ sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/1:"\1", 2:"\2", 3:"\3"/' file
    1:"", 2:"1844", 3:"-PAL.Bak "
    1:"IMG_", 2:"1959", 3:"bak  "
    1:"ZER_", 2:"1940", 3:"BAK  "
    1:"PEN", 2:"225", 3:"bak"
    1:"word-", 2:"1943", 3:"BAK"
    
  2. perl

    $ perl -lpe 's/([^\d]*)(\d*)([^\d])/1:"$1", 2:"$2", 3:"$3"/' file
    1:"", 2:"1844", 3:"-"PAL.Bak 
    1:"IMG_", 2:"1959", 3:"."bak  
    1:"ZER_", 2:"1940", 3:"."BAK  
    1:"PEN", 2:"225", 3:"."bak
    1:"word-", 2:"1943", 3:"."BAK
    
  3. grep

    $ grep -oP '\d+' file
    1844
    1959
    1940
    225
    1943
    

행당 하나의 관심 패턴만 있는 경우 다음과 같이 단순화할 수 있습니다.

 $ sed -r 's/[^0-9]*([0-9]*).*/Matched: \1/' file
Matched: 1844
Matched: 1959
Matched: 1940
Matched: 225
Matched: 1943

또는

$ perl -lpe 's/.*?(\d+).*/Matched $1/' file
Matched 1844
Matched 1959
Matched 1940
Matched 225
Matched 1943

일반적으로 정규식의 경우 적을수록 좋습니다. 항상 필요한 가장 간단한 정규식을 사용하도록 노력해야 합니다. 숫자가 아닌 문자를 캡처하거나 일치시키지 않으려면 정규식에서 해당 문자를 제외하세요.

답변2

다음 GNU grep명령을 시도해 보십시오.

grep -oP '[0-9]{3,4}' file

답변3

sed -e "s/^[^0-9]*//g" -e "s/\(^[0-9]*\)\(.*\)/\1/" <file_name>

이를 수행하는 또 다른 방법

sed 's/[^0-9]*//g' <file_name>

관련 정보