更新:正如许多评论家指出的那样,我的问题格式不正确。抱歉并感谢您!我正在更新我的问题,但将旧问题留在最后以供参考。
更新的问题 我想提取两个给定表达式(例如正则表达式)之间的行并重复执行此操作,直到到达文件末尾。
因此给定输入:
apple
hello
banana
world
brave
new
blueberries
hello
orange
fiddle
world
cup
和模式hello
和world
,我想要输出:
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
打印相应的*5
and 。*6
结果命令是
seq 20 | sed -n 4~10,+2p