2014-06-06 60 views
0

可以使用正则表达式查找一行后使用一个步骤吗?正则表达式后的sed步骤

例如,

对于文件

A 
B 
C 
D 
E 
F 

这工作,

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

但这不起作用

sed '/B/~2p' -n 

我对未知的命令指责〜

感谢

+1

您的预期结果是什么? – Subbeh

回答

3

如果你读SED(GNU sed)的信息/ man页面,有NO地址格式是这样的:

/REGEX/~step 

有:

  • FIRST~STEP,需要两个数字,并且
  • ADDR1, ~N它与之间的范围匹配和一号线数(无),即no%N==0

我认为你要么由两个以上的困惑,或者没有检查手册页,只是认为有“应该是”这样的地址。

我猜,你想这样做:

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

有没有办法让这个工作的步长不是2? –

+0

添加更多'n'命令。 – tripleee

+0

@tripleee与我有限的sed知识,这可能是我会做得很好,但我认为可能有一些比这更好。 –

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 
0

这里有一个方法你可以在awk中实现同样的事情,如果你有兴趣:

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

当模式匹配时,范围运算符的计算结果为true,并在文件结尾保持为真。虽然这是真的,但i会增加,当它是奇数时,会打印此行。

上述版本适用于每隔一行打印,但不适用于每行N行的更一般情况。为了做到这一点,你可以稍微修改它是这样的:

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

其中N是你的一步。