2012-06-04 11 views
0

更多的好奇心,但有没有办法将这两个sed命令压缩成一个?这两个`sed`命令如何被压缩成一个?

sed -r '/sometext/!d' file.txt | sed -r '5,10!d' 

以上给出了包含“sometext”的行的第5到第10个实例(共6个)。

级联:

sed -r '/sometext/!d;5,10!d' file.txt 

给我只能在具有“SomeText”则会通过原始文件的第10行出现在5日线。

+0

你能提供一个样本输入/输出? – kev

回答

2

这可能会为你工作:

# make some test data 
# seq 50 > /tmp/a 
sed -i 's/.*/& sometext/;n' /tmp/a 
# run existing commands 
sed -r '/sometext/!d' /tmp/a | sed -r '5,10!d' 
sometext 
9 sometext 
11 sometext 
13 sometext 
15 sometext 
17 sometext 
19 sometext 
# run new command 
sed '/sometext/H;$!d;g;s/\n/&&/5;s/.*\n\n//;s/\n/&&/6;s/\n\n.*//' /tmp/a 
9 sometext 
11 sometext 
13 sometext 
15 sometext 
17 sometext 
19 sometext 

解释:利益

  • 推入线保持空间(HS)。 /sometext/H
  • 删除除最后一行以外的所有其他行。 $!d
  • 用HS的内容覆盖最后一行。 g
  • 删除前5行。注:第一个换行符是来自H命令的工件。 s/\n/&&/5;s/.*\n\n//
  • 删除除前6行外的所有内容。 s/\n/&&/6;s/\n\n.*//'

N.B.所述5,10!d命令意味着删除所有但线5至10

+0

我在你的sed-fu之前鞠躬;但我认为我会坚持管道的脚本可读性! – Jamie

1

不sed的,但AWK是相当可读:

awk '/sometext/ && ++count && 5 <= count && count <= 10' file.txt 
+0

是的,很可读。 +1 – Jamie