【发布时间】:2016-02-09 01:29:51
【问题描述】:
所以我找到了这个 sed 表达式,用于获取关键字之间的文本,不包括关键字:
cat example.txt | sed '/^KEYWORD1/,/^KEYWORD2/!d; //d'
example.txt:
do
not
care
KEYWORD1
I
want
this
KEYWORD2
do
not
care
输出:
I
want
this
但是,我想确切地了解这个表达式是怎么回事。我的理解是,使用“模式范围”(如果这是不正确的术语,请纠正我),当您点击第一个匹配项时会设置一个布尔值,并且只有在该布尔值为真时才会执行模式范围之后的命令.
然后是//d,其中// 应该表示匹配的最后一个表达式/正则表达式。那么在这种有模式范围的情况下,逻辑如下是否正确:
- 循环
- 找到
/^KEYWORD1/,将bool设置为true,继续执行!d命令,它不会删除这一行,那么由于最后一个正则表达式是/^KEYWORD1/,那么//d实际上是/^KEYWORD1/d,它会删除这一行 - bool 为真,因此它继续不删除下 3 行,并且在所述行中未找到
/^KEYWORD1/,因此不会删除任何内容 - 找到
/^KEYWORD2/d,执行!d,然后/^KEYWORD2/d,因为这是最后一次使用的正则表达式
所以此时我不确定如何不打印之前和之后的行,因为它不执行命令(!d),除非模式范围标志设置为 true。
或者 sed 是否至少查看每一行的命令,并且由于第一个命令是反向删除,它会以某种方式改变逻辑以删除模式范围 bool 为 false 的所有其他行?
任何有关此 sed 表达式如何工作的说明将不胜感激。我已经阅读了this great resource 上下,但仍然不太了解表达式的所有细节。
【问题讨论】:
-
如果您将光标悬停在上面的
sed标志上并选择info,您可以找到与sed 相关的大量资源。或许this链接也能启发你。