一致パターン「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

次に、3つのファイルに対して次のコマンドを実行します。

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/ )。これは2つのブールテストです。

  1. /is/is、文字列が現在のレコード(行)にある場合はtrueです。

  2. NR == something、入力ラインにある場合、これは正しいですsomething

このawk言語では、値は本物は1なので、もし/is/そうなら本物/is/、1になります。文字列を含む各行の式は1ですis。最初のファイルはis行 1 にあり、2 番目のファイルは行is2 にあり、3 番目のファイルは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

3つのファイルのうち最初と最後のファイルはこの条件を満たしますが、2番目のファイルはそうではありません。

関連情報