1

我有一个正则表达式的例子:

seq 20 | awk 'NR!~/^2$|^12$|^15$/'

相同,但使用链式表达式:

seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"'

是否可以编写更短的字符串表达式?

seq 20 | awk 'NR != "2" | "12" | "15" '

谢谢你的解释。

4

2 回答 2

2

据我所知不是。正如您所暗示的那样,如果您想以这种方式执行相等测试(或不等式测试,在这种情况下),您将需要使用正则表达式。

如果要忽略多个值,请考虑在BEGIN块中使用数组。!(NR in array)awk遍历每一行时,这将使表达式更短(即表达式现在很简单:):

seq 20 | awk 'BEGIN { array[2]++; array[12]++; array[15]++ } !(NR in array)'

结果:

1
3
4
5
6
7
8
9
10
11
13
14
16
17
18
19
20

如果您尝试忽略的行有某种模式,请考虑在块中使用for循环:BEGIN

seq 20 | awk 'BEGIN { for (i=1; i<=15; i++) array[i]++ } !(NR in array)'

16
17
18
19
20
于 2012-10-13T08:50:50.977 回答
1

第一个可能是最短的,如果你把锚放在一个组之外,它会更短()

seq 20 | awk 'NR !~ /^(2|12|15)$/'
于 2012-10-15T04:31:35.080 回答