정규식은 순서에 관계없이 모든 토큰과 일치합니다.

정규식은 순서에 관계없이 모든 토큰과 일치합니다.

정규식에 대한 간단한(간단한) 질문이 있습니다. 순서에 관계없이 모든 토큰 집합과 일치하는 정규식을 생각하려고 합니다.

예를 들어, 미국의 주 이름이 포함된 파일이 있습니다.

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

관련 정보