关于`NR==/regex/`匹配模式

Pra*_*ngh 4 awk

当我运行一个awk具有语法的命令时NR== /regex/,它会产生意想不到的结果。文件内容:

cat file

## This is
## a
## b
## c
## end
## e
## f
## g
Run Code Online (Sandbox Code Playgroud)

现在我在文件开头添加一个空行。

sed '1 s.^.\n.' file >file2
Run Code Online (Sandbox Code Playgroud)

我添加另一行是这样的:

sed '1 s.^.user288752 is back\n.' file2 >file3
Run Code Online (Sandbox Code Playgroud)

现在我在三个文件上运行以下命令:

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

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

awk 'NR== /is/, /end/' file2
Run Code Online (Sandbox Code Playgroud)

在 file2awk中什么都不匹配。

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

## user288752 is back
## 
## This is
## a
## b
## c
## end
Run Code Online (Sandbox Code Playgroud)

在我看来,is只有当它出现在第 1 行时才匹配。但我没有$0 ~ /is/在这个命令中写过。并且is不等于NR。我知道is在这种情况下是 regex( /is/) 但为什么is要匹配 NR?我缺少什么?

Kus*_*nda 12

我们来看看NR == /is/

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

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

  2. NR == something,如果我们在输入行,这是真的something

在该awk语言中,值为true的布尔值是 1,所以如果/is/true,它将是 1。表达式/is/在包含 string 的每一行上都是 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
Run Code Online (Sandbox Code Playgroud)

我们现在知道/is/在某些行上是 1。这意味着如果1 与 1 同时为1,则NR == /is/测试为,它只能在输入的第一行(如果有的话),因为计算输入的行数。/is/NRNR

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