정규식에 대한 간단한(간단한) 질문이 있습니다. 순서에 관계없이 모든 토큰 집합과 일치하는 정규식을 생각하려고 합니다.
예를 들어, 미국의 주 이름이 포함된 파일이 있습니다.
Abbreviation:State name:Capital:Became a state
AL:Alabama:Montgomery:December 14, 1819
AK:Alaska:Juneau:January 3, 1959
AZ:Arizona:Phoenix:February 14, 1912
...
WI:Wisconsin:Madison:May 29, 1848
WY:Wyoming:Cheyenne:July 10, 1890
이름에 "A", "R", "N"이라는 문자가 있는 모든 주(대소문자 구분 안 함)를 찾고 싶다고 가정해 보겠습니다.
내가 하나 만들 수 있어
$ cut -d: -f2 states.txt | tail -n +2 | grep -i a | grep -i r | grep -i n
물론 그런 일이 일어났습니다
Arizona
Arkansas
California
Maryland
Nebraska
New Hampshire
North Carolina
North Dakota
Rhode Island
South Carolina
Virginia
West Virginia
세 글자가 모두 어떤 순서로든 나타나는 경우 단일 정규식을 사용하여 일치시킬 수 있는 방법이 있습니까?
답변1
다음을 사용해야 합니다 awk
.
$ awk '/a|A/ && /R|r/ && /N|n/' file
Arizona
Arkansas
California
Maryland
Nebraska
New Hampshire
North Carolina
North Dakota
Rhode Island
South Carolina
Virginia
West Virginia
통과하면 gawk
사용할 수 있습니다대소문자 무시:
gawk '/a/ && /r/ && /n/' IGNORECASE=1 file
답변2
이 명령 grep
에는 적절한 AND 연산자가 없으므로 이와 같은 문제를 해결하려면 창의력을 발휘해야 합니다. 여러 개를 선택하고 grep
함께 연결할 때 이 작업을 수행할 수 있습니다. 하지만 다음과 같이 할 수도 있습니다.
$ echo -e "arie\narin" | grep -i '[arn].*[arn].*[arn]'
arin
이는 a, r 또는 n의 조합을 포함하는 모든 문자열과 일치하며 이 세트에 3번 나타나는 문자를 포함해야 합니다.
공백이 있는 단어
공백을 처리하려면 위 정규식을 다음과 같이 조정할 수 있습니다.
$ echo -e "arie\narin\nar nie" | \
grep -i '[arn][[:alpha:]]*[arn][[:alpha:]]*[arn]'
arin
여기서는 블록 사이에 모든 유형의 문자를 허용하는 대신 [arn]
더 선택적으로 [[:alpha:]]
세트에서만 문자를 가져옵니다. 또한 중간에 0개 이상의 문자가 grep
필요하다는 것도 알려줍니다.*
답변3
cut -d: -f2 states.txt | tail -n +2 | egrep -i '[arn].*[arn].*[arn]'
답변4
음, 한 가지 옵션은 sed
비록 이것이 grep
대안보다 훨씬 느릴 수 있다는 것입니다.
cut -d: -f2 states.txt | tail -n +2 | sed -n -e '/a/I{/r/I{/n/Ip}}'
Arizona
Arkansas
California
Maryland
Nebraska
New Hampshire
North Carolina
North Dakota
Rhode Island
South Carolina
Virginia
West Virginia