给定一个 425M 大小的文本文件,内容如下:
--START--
Data=asdfasdf
Device=B
Lorem=Ipsum
--END--
--START--
Data=asdfasdf
Lorem=Ipsum
Device=A
--END--
--START--
Device=B
Data=asdfasdf
--END--
...
任务sed
是打印--START--
和之间的所有内容--END--
,其中Device=A
包含 。这里和这里提供了两种解决方案。两个命令之间存在巨大的执行时间差异。第二个命令相当快,但需要更多的说明来说明它是如何工作的吗?
$ sed -n '/--START--/{:a;N;/--END--/!ba; /Device=A/p}' file
$ sed 'H;/--START--/h;/--END--/!d;x;/Device=A/!d' file
第一条命令的说明:
怎么运行的:
/--START--/{...}
每次我们到达包含 的行时--START--
,运行大括号内的命令{...}
。
:a;
定义标签“a”。
N;
阅读下一行并将其添加到模式空间。
/--END--/!ba
除非模式空间现在包含--END--
,否则跳回标签a
。
/Device=A/p
如果我们到达此处,则意味着模式空间以 开始--START--
并以 结束--END--
。此外,如果模式空间包含Device=A
,则打印 (p
) 它。
2号命令说明:
sed 'H #add line to hold space /--START--/h #put START into hold space (substitute holded in) /--END--/!d #clean pattern space (start next line) if not END x #put hold space into pattern space /Device=A/!d #clean pattern space if it have not "Device=A" ' file