【发布时间】:2021-04-30 22:10:26
【问题描述】:
我有一个 18M 长的 xml 文件,其中包含媒体列表的一系列记录。文件的大小取决于每条记录都有一个嵌入图像这一事实。导出列表的应用程序导出了整个记录列表,没有回车。我要做的是仅提取每个 xml 记录中包含该记录的描述字段的部分。一些示例记录如下所示:
<media>
<version>2</version>
<broadcasts><broadcast><name>KSBW-DT</name><description>KSBW-DT Channel 8</description><genre /><audio_only>False</audio_only><cover_art>THERE IS A MEGABYTE OF IMAGE DATA CONTAINED HERE IN EACH RECORD</cover_art><location>8</location><img>b4/b4098184-bc85-4b17-9a87-43d2c4a23bdd</img></broadcast>
<broadcast><name>Cntrl Coast</name><description>Cntrl Coast Channel 9</description><genre /><audio_only>False</audio_only><cover_art>THERE IS A MEGABYTE OF IMAGE DATA CONTAINED HERE IN EACH RECORD</cover_art><location>9</location><img>44/443f0080-ca33-4150-8873-23359d8999dd</img></broadcast>
...(680 more records)....
</broadcasts></media>
我玩 awk 已经有一段时间了,现在试图只提取“描述文本”,但结果却是空的。我尝试的任何模式要么返回不匹配,要么返回包含所有数据的整个 18MB 字符串。这是我的 awk 脚本的最新版本:
#!/bin/bash
set -x
awk '{
for( i=1; i<=NF; i++) {
tmp=match($i, /\<description\>.*\<\/description>)
if (tmp) {
print $i
}
}
}' $1
但这并没有返回任何东西。我过去只使用过 awk,其中文本中有典型的行,而不是连续的 18MB 字符串。 awk 甚至可以解析这样的东西吗?我已经尝试了 web-grep -o、sed 上建议的替代方法,但我似乎无法得到任何工作。
感谢任何帮助或指导。
谢谢.....
【问题讨论】:
-
感谢您在问题中展示您的努力,您能否在您的问题中也发布预期输出示例以便更好地理解问题,谢谢。
-
Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
-
另一个选项是
xpath,一个perl程序...看看xpath -q -e '//description/text()' file是否解决了你的问题,见stackoverflow.com/questions/15461737/…