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