2013-08-01 3 views
0

: 나는 약간 앞으로 안에 정규식의 적절한 사용에 의해 의아해하고 있습니다AWK - 액션 내부 (슬래시) 정규식 문을 사용하여 (괄호)를 사용하여

$ awk --version 
GNU Awk 3.1.7 

행동 내부 /awk에서 { } 중괄호 슬래시. 예를 들어,이 작품 :

$ echo "4,testing" | awk -F, '/test/ {print $0}' 
4,testing 

도 (추가 외부 활동 중괄호가 추가 제공) 작품, 대신 슬래시 정규식 구문의, ifmatch 사용 :

$ echo "4,testing" | awk -F, '{if(match($0, "test")) {print $0}}' 
4,testing 

그래서, 그런 것 같아요, /REGEX/if(match($0, "test"))과 동일해야합니다. 맞습니까?

$ echo "4,testing" | awk -F, '{if($1==4) {if(match($0, "test")) {print $0}}}' 
4,testing 

...하지만 예상대로 중첩 작업에서 다음 전체 문자열에 정규식 체크 ... 그리고 matchif 작품에서 중괄호 -

은 어쨌든, 나는 필드 당 몇 가지 테스트를 수행 할 내가 슬래시 정규식으로 if(match(...))를 교체하려면 다음, 내가 얻을 :

$ echo "4,testing" | awk -F, '{if($1==4) {/test/ {print $0}}}' 
awk: {if($1==4) {/test/ {print $0}}} 
awk:     ^syntax error 

사람이 설명 할 수 규칙이 무엇인지, 때 앞으로 사용 정규식 슬래시 - 언제 match() 정규식을 사용할 수 있나요?

$ echo "4,testing" | awk -F, '{if($1==4) {if(/test/) {print $0}}}' 
4,testing 

... 보인다 있도록 : 액션 내에서, 슬래시 정규식은 if 문의 인수에 있어야합니다


이 글을 쓰는 동안, 나는이 작품 것을 우연히 발견 ...하지만 위의 첫 번째 예에서 정규식은 if() 인수에있는 이 아닌 (적어도 나에게 명백한 방식이 아님)을 감안할 때 나에게 의미가 없나요?

답변

3

match() 함수는 함수가 아니라 동작 인 것처럼 awk/test/ 좋아하지 동작의 정규식 문자열이다.구문 /test/{print $0}은 짧은 핸드 if ($0~/test/){print $0}입니다. 여기서 ~은 정규식 비교 연산자입니다. 이것은 조건이 블록 외부에있는 경우입니다.

여전히 때 블록 내부의 if 문에 필요하지만 당신은 {/test/{print $0}}{if (match($0, "test")){print $0}}을 상당한다됩니다

$ echo "4,testing" | awk -F, '{if($1==4) {if (/test/){print $0}}}' 
4,testing 

~는 그것이 쓰임새입니다 가지고는하지만 일반적으로하지 match() 기능을 사용하는 것입니다 정규 표현식 연산자.

$ echo "4,testing" | awk -F, '$1==4&&/test/' 
4,testing 

우리는 awk의 기본 블록으로 블록을 필요가 없습니다 {print $0}하고 우리는 논리 연산자 AND 두 조건이 모두 사용 TRUE 것에 대해 테스트 할를 사용

당신이 정말 일을해야하는 것입니다 &&.

+0

환상적인 설명, @ sudo_O - 특히 속기에 관한 부분이 나를 많이 설명했습니다. 늦게 받아들이는 것에 대한 사과 - 환호! – sdaau

1

awk의 기본 신택스는 시퀀스 점이다 :

<condition> <action> 

<condition> 각 행에있어 시험 식이고; 맞으면 <action>이 실행됩니다. 작업이 { ... } 블록 인 경우 을 포함해야합니다. 성명서에서 조건을 테스트하려면 if을 사용해야합니다.

또 다른 방법은 각 awk 행의 <condition> 부분에 암시적인 if이 있다는 것입니다.

정규 표현식은 조건에 나타날 수있는 표현식 유형입니다. 순방향 내부 문자열 슬래시

+0

@ Barmar를 보내 주셔서 감사합니다. - 늦은 답변을 드려 죄송합니다. 나는 보통 그러한 일반적인 의미 론적 설명 (이 경우와 같이)으로 여행하지만, "암시적인"if "에 대한 부분은 도움이된다. 그러나 @sudo_O에 의한 나의 실수에 대한 세부적인 사항은 받아 들일 만하다고 생각합니다. 건배! – sdaau