当我运行一个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/ ),这是两个布尔测试:
/is/,如果字符串is存在于当前记录(行)中,则为真。
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
在您的三个文件中,第一个和最后一个满足此条件,而第二个不满足。
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |