![3~4개의 숫자를 찾는 정규 표현식](https://linux55.com/image/36763/3~4%EA%B0%9C%EC%9D%98%20%EC%88%AB%EC%9E%90%EB%A5%BC%20%EC%B0%BE%EB%8A%94%20%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D.png)
그래서 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
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"
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
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>