패턴 일치에서 변수와 정규식 결합

패턴 일치에서 변수와 정규식 결합

3개의 문자와 3~4개의 숫자로 구성된 열을 파일에서 검색하고 싶습니다. 예를 들어.

if ( $1 ~ /^[A-Z][A-Z][A-Z][0-9][0-9][0-9]/) 

그런데 이 3글자가 변수로 필요해서 결과를 찾고 있어요

SP="ABC" 
if ( $1 ~ /^/SP/[0-9][0-9][0-9]/)>

그러나 이것은 작동하지 않습니다. 검색 패턴에서 변수와 정규식을 결합하는 방법은 무엇입니까?

답변1

SP="ABC" 
if ( $1 ~ "^" SP "[0-9]{3}")

연결하시면 됩니다그러나 대신 /xxx/s는 실제로 정규식 일치 연산자에 더 가깝고 구문 분석 규칙이 혼란스러울 수 있습니다(구현마다 다를 수 있음).

$1 ~ /ABC/ /BCD/

이는 ( 일치 여부 에 따라 1 또는 0 )과 ( 일치 여부 에 따라 1 또는 0 ) 의 연결 $1로 일치 항목을 연결하거나 일치하는 쌍 (0 또는 0) 을 연결하는 것으로 볼 수 있습니다. 1) 혼동될 수 있는 match 를 사용하는 경우. 단, 이 연산자는 나누기 연산자와 혼동될 수 있으므로 다른 연산자(여기서는 연결 연산자 등)와 함께 사용하면 잘 작동하지 않습니다 ./ABC/$0/ABC//BCD/$0/BCD/$1/ABC/$0/BCD//regexp//

하지만 괄호를 사용하면 흥미로워집니다(읽기SUV)행동:

$ echo 11 ab | gawk '{print $1 ~ /a/ (/b/)}'
1
$ echo 11 ab | bwk-awk '{print $1 ~ /a/ (/b/)}'
01
$ echo b | bwk-awk '{print /a/ - (/b/)}'
0-1

(후자는 /a/(0)을 의 결과와 연결한 결과 이다 - (/b/).)


에서 $1 =~ "^" SP "[0-9]{3}"SP의 내용은 여전히 ​​정규식으로 처리됩니다(그렇다면 ...3개의 점이 아닌 3개의 문자와 일치).

if (index($1, SP) == 1 && substr($1, length(SP)+1) ~ /^[0-9]{3}/)

답변2

awk에게 정확한 문자로 시작하고 대괄호 안에 "type" 문자를 사용한 다음 중괄호 안에 반복되는 숫자를 사용하는 정규식을 읽도록 지시할 수 있습니다. 이와 같이:

echo "ABC956" |  awk '{ if( $1 ~ /^ABC[0-9]{3}/) print "HELLOWORLD" }'                                 
HELLOWORLD

&&논리 연산자를 사용하여 변수 및 정규 표현식의 존재 여부를 테스트할 수도 있습니다.

echo "ABC956" |  awk -v VAR="ABC" '{ if( $1 ~ VAR && $1 ~ /[0-9]{3}/) print "HELLOWORLD" }'            
HELLOWORLD

관련 정보