使用 sed 范围表达式匹配多个范围

使用 sed 范围表达式匹配多个范围

更新:正如许多评论家指出的那样,我的问题格式不正确。抱歉并感谢您!我正在更新我的问题,但将旧问题留在最后以供参考。

更新的问题 我想提取两个给定表达式(例如正则表达式)之间的行并重复执行此操作,直到到达文件末尾。

因此给定输入:

apple
hello
banana
world
brave
new
blueberries
hello
orange
fiddle
world
cup

和模式helloworld,我想要输出:

hello
banana
world
hello
orange
fiddle
world

如果它有帮助,我可以假设没有重叠,即我们hello在遇到 之前从未遇到过两个 s world

老问题

seq 20 | sed -n '4,6p'

输出以下内容:

4
5
6

但我想要的是:

4
5
6
14
15
16

有没有办法使用 sed (或 awk,或 grep)来做到这一点?谢谢!

答案1

使用sed,怎么样

seq 20|sed -n '4,6p;14,16p'

或者使用awk

seq 20|awk 'NR>3&&NR<7||NR>13&&NR<17'

假设您想要匹配行内容而不是行号,则可以使用这两种方法中的任何一种。

seq 20|sed -n '/^4$/,/^6$/p;/^14$/,/^16$/p'
seq 20|awk '/^4$/,/^6$/;/^14$/,/^16$/'

答案2

您的sed表达式打印第 4 行到第 6 行,或者更确切地说,它调用p由地址指定的行范围的命令4,6。要另外打印第 14 行到第 16 行,请p调用地址14,16。您可以通过使用;或 换行符分隔它们,或者通过提供-e带有参数的多个选项来添加进一步的编辑表达式:

$ seq 20 | sed -n -e '4,6p' -e '14,16p'
4
5
6
14
15
16

对于awk,你可以用类似的方式来做,

$ seq 20 | awk 'NR == 4, NR == 6; NR == 14, NR == 16'
4
5
6
14
15
16

或者,如果您总是想要每组 10 行中的第 4、5 和 6 行:

$ seq 30 | awk 'NR%10 == 4, NR%10 == 6'
4
5
6
14
15
16
24
25
26

使用 GNU sed,你会得到同样的效果

sed -n -e '4~10p' -e '5~10p' -e '6~10p'

答案3

您正在使用的命令sed没有按照您的想法执行。它只在第4行到第6行上运行。4,6您输入的命令是一个行范围,如果您运行可以更清楚地看到其效果seq 5 15 | sed -n '4,6p'。然后裸机p简单地打印该行。

grep做你想做的事情的一种方法是:

seq 20 | grep -e '[456]'

这并不完全正确,因为如果你运行

seq 50 | grep -e '[456]'

您将得到以 4、5 或 6 开头的数字,而不仅仅是以该数字结尾。我假设您想打印以搜索字符串结尾的行;尽管这是一个可能没有根据的假设。

如果您编辑问题以更全面地解释您想要发生的情况,您可能会得到更好的帮助。

答案4

我想出的解决方案看起来很像@他们发布的解决方案,但实际上使用了不同的技术。我使用了双地址格式。我没有使用第一个地址来打印4, 5, & 6,而是使用它来匹配4, 14, etc.,然后使用第二个地址的语法为每个实例+N打印相应的*5and 。*6

结果命令是

seq 20 | sed -n 4~10,+2p

相关内容