Answers:
awk
在必要时与标志一起使用以触发打印:
$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2
这是如何运作的?
/abc/
匹配具有此文本的行,也是/mno/
如此。 /abc/{flag=1;next}
设置flag
何时abc
找到文本。然后,它跳过了这一行。 /mno/{flag=0}
找到flag
文字时取消设置mno
。flag
是具有默认操作的模式,即print $0
:如果flag
等于1,则打印该行。有关更详细的描述和示例,以及显示或不显示图案的情况,请参见如何在两个图案之间选择线?。
awk '/abc/{a=1} a; /mno/{a=0}' file
-在此a
条件下,在set 之前将条件置于/mno/
true 之前,将其评估为true(并打印)a=0
。这样我们就可以避免写作print
。
awk '/abc/,/mno/' file
awk '/abc/{flag=1}/mno/{flag=0}flag' file
应该使。
awk 'flag; /PAT1/{flag=1; next} /PAT1/{flag=0}' file
会。
使用sed
:
sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'
该-n
选项表示默认情况下不打印。
该模式查找仅包含abc
到just的行mno
,然后执行中的动作{ ... }
。第一个动作删除该abc
行;第二mno
行;然后p
打印剩余的行。您可以根据需要放松正则表达式。abc
.. 范围以外的任何行都mno
不会被打印。
-e
sed
应执行的脚本(的一部分)。如果要或需要使用几个参数来包含整个脚本,则必须-e
在每个这样的参数之前使用;否则,请转入第二个。否则,它是可选的(但显式)。
d
第一个匹配之前的d
所有行,然后再将其应用于从第二个匹配开始的所有行?
这可能对您有用(GNU sed):
sed '/^abc$/,/^mno$/{//!b};d' file
删除除以abc
和开头的行之间的行以外的所有行mno
!d;//d
打好2个字符:-) stackoverflow.com/a/31380266/895245
{//!b}
防止abc
和mno
被包含在输出,但我无法弄清楚如何。你能解释一下吗?
//!b
如果当前行不是与范围匹配的行之一,则指令将读取并中断并打印这些行,否则将删除所有其他行。
sed '/^abc$/,/^mno$/!d;//d' file
打高尔夫球比木棒好两个字符 {//!b};d
空的正斜杠//
表示:“重用最后使用的正则表达式”。该命令与更易于理解的命令相同:
sed '/^abc$/,/^mno$/!d;/^abc$/d;/^mno$/d' file
这似乎是POSIX:
如果RE为空(即未指定任何模式),则sed的行为就像指定了所应用的最后一条命令(作为地址或作为替代命令的一部分)中使用的最后一个RE一样。
从上一个响应的链接来看,ksh
在Solaris上运行的为我执行此操作的链接是:
sed '1,/firstmatch/d;/secondmatch/,$d'
1,/firstmatch/d
:从第1行开始,直到您第一次找到firstmatch
,将其删除。/secondmatch/,$d
:从第一次出现secondmatch
到文件结尾,删除。1,
)排在前面/firstmatch/
?我猜这也可以表达'/firstmatch/1,d;/secondmatch,$d'
吗?
这样的事情对我有用:
file.awk:
BEGIN {
record=0
}
/^abc$/ {
record=1
}
/^mno$/ {
record=0;
print "s="s;
s=""
}
!/^abc|mno$/ {
if (record==1) {
s = s"\n"$0
}
}
使用:awk -f file.awk data
...
编辑:O_o fedorqui解决方案比我的更好/更漂亮。
Don_crissti的回答仅显示2个匹配模式之间的文本?
firstmatch="abc"
secondmatch="cdf"
sed "/$firstmatch/,/$secondmatch/!d;//d" infile
比AWK的应用程序效率更高,请参阅此处。
我试图用来awk
在两个模式之间打印行,而pattern2也匹配pattern1。并且pattern1线也应该被打印。
例如来源
package AAA
aaa
bbb
ccc
package BBB
ddd
eee
package CCC
fff
ggg
hhh
iii
package DDD
jjj
应该有一个输出
package BBB
ddd
eee
模式1在哪里 package BBB
,pattern2是package \w*
。请注意,这CCC
不是一个已知值,因此无法进行字面匹配。
在这种情况下,@ scai awk '/abc/{a=1}/mno/{print;a=0}a' file
或@fedorqui 都不awk '/abc/{a=1} a; /mno/{a=0}' file
适合我。
最后,我设法解决这个问题awk '/package BBB/{flag=1;print;next}/package \w*/{flag=0}flag' file
,哈哈
稍稍花点功夫awk '/package BBB/{flag=1;print;next}flag;/package \w*/{flag=0}' file
,也就打印出pattern2行,即
package BBB
ddd
eee
package CCC
awk '/abc/{a=1}/mno/{print;a=0}a' file
。