如何将这两个`sed`命令压缩成一个?

时间:2012-06-04 00:26:33

标签: 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

只给出了在原始文件的第5行到第10行中出现“sometext”的行。

2 个答案:

答案 0 :(得分: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行之外的所有内容

答案 1 :(得分:1)

没有sed,但awk非常易读:

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