正则表达后的步骤

时间:2014-06-06 14:40:48

标签: linux sed

我可以在使用正则表达式找到一行之后使用一个步骤吗?

例如,

对于文件

A
B
C
D
E
F

这有效,

sed '2~2p' -n
B
D
F

但这不起作用

sed '/B/~2p' -n

我被未知的命令所指责〜

由于

3 个答案:

答案 0 :(得分:3)

如果您阅读sed(GNU sed)的信息/手册页,则地址格式如下:

/REGEX/~step

有:

  • FIRST~STEP,需要两个号码,
  • ADDR1, ~NADDR1和第1行号(否)之间的范围相匹配,no%N==0

我认为你要么被上面的两个搞糊涂了,要么没有检查手册页,只是觉得“应该”是这样的地址。

我想,你想这样做:

kent$  seq 10|sed -n '/2/,${p;n}'
2
4
6
8
10

答案 1 :(得分:0)

awk可以用更详细的方式做你所要求的事情:

seq 20 | 
awk -v pattern="4" -v step=3 '
    !start && $0 ~ pattern {start = NR} 
    start && (NR-start)%step == 0
'
4
7
10
13
16
19

答案 2 :(得分:0)

如果您对此感兴趣,可以在awk中实现同样的目标:

awk '/B/,0 {i++}i%2' file

范围运算符在匹配模式时求值为true,并保持为真,直到文件结束。虽然这是真的,i会增加,当它是奇数时,会打印这条线。

上述版本适用于打印所有其他行,但不适用于每个N行的更一般情况。为此,您可以稍微修改它:

awk '/B/,0 {i++} i%N==1' file

其中N是你的步骤。