일치 패턴 "NR==/regex/"에 대해

일치 패턴 "NR==/regex/"에 대해

awk구문을 사용하여 명령을 실행하면 NR== /regex/예상치 못한 결과가 나타납니다. 문서 내용:

cat file

## This is
## a
## b
## c
## end
## e
## f
## g

이제 파일 시작 부분에 빈 줄을 추가합니다.

sed '1 s.^.\n.' file >file2

다음과 같이 또 다른 줄을 추가합니다.

sed '1 s.^.user288752 is back\n.' file2 >file3

이제 세 개의 파일에 대해 다음 명령을 실행합니다.

awk 'NR== /is/, /end/' file

## This is
## a
## b
## c
## end

awk 'NR== /is/, /end/' file2

file2 에 awk일치하는 항목이 없습니다 .

awk 'NR== /is/, /end/' file3

## user288752 is back
## 
## This is
## a
## b
## c
## end

is제 생각에는 1번째 줄에 나오는 경우에만 일치하는 것 같습니다 . 하지만 저는 $0 ~ /is/이 명령을 쓰지 않았습니다 . 그리고 isNR과 같지 않습니다. is이 경우 regex()라는 것을 알고 있는데 /is/isNR과 일치합니까? 내가 무엇을 놓치고 있나요?

답변1

한 번 보자 NR == /is/.

이는 다음과 같이 다시 작성할 수 있습니다 NR == ( /is/ ). 이는 두 가지 부울 테스트입니다.

  1. /is/is, 문자열이 현재 레코드(행)에 있으면 true입니다.

  2. NR == something, 입력 라인에 있다면 이는 정확합니다 something.

awk언어에서 값은진짜는 1이므로 만약 /is/그렇다면진짜/is/, 1이 됩니다. 문자열을 포함하는 각 줄의 표현식은 1 입니다 is. 첫 번째 파일은 is라인 1에 있고, 두 번째 파일은 is라인 2에 있고, 세 번째 파일은 is라인 1과 3에 있습니다.

$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file1
NR: 1   /is/: 1
NR: 2   /is/: 0
NR: 3   /is/: 0
NR: 4   /is/: 0
NR: 5   /is/: 0
NR: 6   /is/: 0
NR: 7   /is/: 0
NR: 8   /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file2
NR: 1   /is/: 0
NR: 2   /is/: 1
NR: 3   /is/: 0
NR: 4   /is/: 0
NR: 5   /is/: 0
NR: 6   /is/: 0
NR: 7   /is/: 0
NR: 8   /is/: 0
NR: 9   /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file3
NR: 1   /is/: 1
NR: 2   /is/: 0
NR: 3   /is/: 1
NR: 4   /is/: 0
NR: 5   /is/: 0
NR: 6   /is/: 0
NR: 7   /is/: 0
NR: 8   /is/: 0
NR: 9   /is/: 0
NR: 10  /is/: 0

이제 우리는 /is/일부 라인에서는 1이라는 것을 알고 있습니다. 이는 NR == /is/테스트가 다음과 같이 진행됨을 의미합니다.진짜/is/가 1과 동시에 1인 경우 입력 라인이 계산되기 NR때문에 입력의 첫 번째 라인에만 있을 수 있습니다(있는 경우) .NR

세 개의 파일 중 첫 번째와 마지막 파일은 이 조건을 충족하지만 두 번째 파일은 그렇지 않습니다.

관련 정보