我有一个正则表达式的例子:
seq 20 | awk 'NR!~/^2$|^12$|^15$/'
同样,但链表达式:
seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"'
是否可以编写更短的字符串表达式?
seq 20 | awk 'NR != "2" | "12" | "15" '
感谢您的解释。
答案 0 :(得分: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
答案 1 :(得分:1)
第一个可能是最短的,如果你将锚点留在一个组()
之外会更短:
seq 20 | awk 'NR !~ /^(2|12|15)$/'