关于匹配模式的“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/在这个命令中写入。并且is不等于NR。我知道is在这种情况下是 regex( /is/) 但为什么is要匹配 NR?我缺少什么?

答案1

我们来看一下NR == /is/

这可以重写为NR == ( /is/ ),这是两个布尔测试:

  1. /is/is,如果该字符串存在于当前记录(行)中,则为 true 。

  2. NR == something,如果我们位于输入行 ,则这是正确的something

在该awk语言中,值为真的是 1,所以如果/is/真的/is/,它将为 1。包含字符串 的每一行上的表达式将为 1 is。第一个文件位于is第一行,第二个文件位于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/测试将是真的if/is/与 is 1 同时为NR1,它只能位于输入的第一行(如果有的话),因为对NR输入行进行计数。

在您的三个文件中,第一个和最后一个满足此条件,而第二个则不满足。

相关内容