我有一个 odt 文件,文本行之间有空行。我想搜索一个术语并输出与该术语匹配的整组文本。我的做法是说odt文件中的空行是记录分隔符。Odt 文件是 zip 档案,其文本包含在 content.xml 中。解压缩 odt 文件后,我使用 xmllint --format content.xml 插入换行符(如下所示),“空白”行实际上是 > 和 < 之间没有文本的行。所以我想将 RS 设置为在 > 和 < 之间没有文本的任何此类行。如果格式化后的 content.xml 文件如下:
<long line of alphanumerics, slashes, single and double quotes><more or the same><and many more>
<office:text>
<text:sequence-decls>
<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
<text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
</text:sequence-decls>
<text:p text:style-name="P1">This is the first line</text:p>
<text:p text:style-name="P1"/>
<text:p text:style-name="P1">This is the third line</text:p>
<text:p text:style-name="P1">and this is some more text that is to be included</text:p>
<text:p text:style-name="P1"/>
<text:p text:style-name="P1">This is the sixth. I want it included,</text:p>
<text:p text:style-name="P1">with this line</text:p>
<text:p text:style-name="P1">and this one</text:p>
</office:text>
和代码是
$ awk '/line/' RS='\n[ \t]*<[^>]*>\n' file.xml
整个文件被输出。但我只想要:
<text:p text:style-name="P1">This is the first line</text:p>
<text:p text:style-name="P1">This is the third line</text:p>
<text:p text:style-name="P1">and this is some more text that is to be included</text:p>
<text:p text:style-name="P1">This is the sixth. I want it included,</text:p>
<text:p text:style-name="P1">with this line</text:p>
<text:p text:style-name="P1">and this one</text:p>
你的方法充满了问题。最重要的是,没有明显的方法可以将正则表达式匹配限制为文档的正文 -
/line/
例如,这将匹配诸如<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
(您的正则表达式消耗两个换行符也存在问题
RS
,这将阻止它正确处理相邻的分隔符;RS='\n([ \t]*<[^>]*>\n)+'
可能会解决这个问题,但我不会保证)。相反,我建议先提取文档的正文,然后在“传统”段落模式下应用 awk(即使用空记录分隔符):
或使用 GNU awk,保留解析后的实际记录分隔符:
您甚至可以完全省略中间文件,将标准输出从
unzip -p
:在使用 awk 之前,我根据 steeldriver 的灵感回答了我自己的问题,修改了文件:
然后我能够提取 $searchterm 匹配项的整个记录