0

更多的是好奇,但是有没有办法将这两个 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”的行。

4

2 回答 2

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.*//'

注意5,10!d命令意味着删除除第 5 到 10 行之外的所有内容

于 2012-06-04T07:19:57.217 回答
1

不是 sed,但 awk 可读性很强:

awk '/sometext/ && ++count && 5 <= count && count <= 10' file.txt
于 2012-06-04T11:01:12.627 回答