从 href 元素中提取文件名

min*_*nto 2 command-line xml text-processing

我有一个包含文件列表的文档。在 href 元素(不带引号)中提取文件名并将其复制到由换行符分隔的列表中的简单方法是什么?

<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="css" href="845214570.css" media-type="text/css"/>
<item id="cover-image" href="845214570.jpg" media-type="image/jpeg"/>
<item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
<item id="cover" href="cover.xhtml" media-type="application/xhtml+xml"/>
<item id="author" href="author.xhtml" media-type="application/xhtml+xml"/>
<item id="title" href="title.xhtml" media-type="application/xhtml+xml"/>
<item id="copy" href="copy.xhtml" media-type="application/xhtml+xml"/>
<item id="contents" href="contents.xhtml" media-type="application/xhtml+xml"/>
<item id="preface" href="preface.xhtml" media-type="application/xhtml+xml"/>
<item id="ack" href="ack.xhtml" media-type="application/xhtml+xml"/>
<item id="ch1" href="ch1.xhtml" media-type="application/xhtml+xml"/>
<item id="ch2" href="ch2.xhtml" media-type="application/xhtml+xml"/>
<item id="ch3" href="ch3.xhtml" media-type="application/xhtml+xml"/>
<item id="ch4" href="ch4.xhtml" media-type="application/xhtml+xml"/>
<item id="ch5" href="ch5.xhtml" media-type="application/xhtml+xml"/>
<item id="ch6" href="ch6.xhtml" media-type="application/xhtml+xml"/>
<item id="ch7" href="ch7.xhtml" media-type="application/xhtml+xml"/>
<item id="ch8" href="ch8.xhtml" media-type="application/xhtml+xml"/>
<item id="ch9" href="ch9.xhtml" media-type="application/xhtml+xml"/>
<item id="ch10" href="ch10.xhtml" media-type="application/xhtml+xml"/>
<item id="ch11" href="ch11.xhtml" media-type="application/xhtml+xml"/>
<item id="app" href="app.xhtml" media-type="application/xhtml+xml"/>
<item id="appb" href="appb.xhtml" media-type="application/xhtml+xml"/>
<item id="appc" href="appc.xhtml" media-type="application/xhtml+xml"/>
<item id="index" href="index.xhtml" media-type="application/xhtml+xml"/>
<item id="img-f0019-01" href="f0019-01.jpg" media-type="image/jpeg"/>
<item id="img-f0027-01" href="f0027-01.jpg" media-type="image/jpeg"/>
<item id="img-f0029-01" href="f0029-01.jpg" media-type="image/jpeg"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)

pLu*_*umo 6

对于这种简单格式的 XML 文件,您可以使用grep

grep -Po 'href="\K[^"]*' file.xml > filenames.lst
Run Code Online (Sandbox Code Playgroud)
  • -P使用 Perl 兼容的正则表达式 (PCRE)
  • -o仅输出匹配项
  • \K 保留一切直到比赛结束
  • [^"]*匹配任意数量的*不是^双引号 ( ) 的字符 ( ")。

但是,如果您有更复杂的xml,您可以而且应该更喜欢合适的xml解析器,例如xmlstarlet

xmlstarlet sel -t -v '//item/@href' -n file.xml > filenames.lst
Run Code Online (Sandbox Code Playgroud)

这可以通过安装

sudo apt install xmlstarlet
Run Code Online (Sandbox Code Playgroud)

由于您已经用 标记了您的问题python,当然您也可以使用它:

#!/usr/bin/env python3
import xml.etree.ElementTree as ET
root = ET.parse('file.xml')
for item in root.findall('.//item'):
    print(item.attrib['href'])
Run Code Online (Sandbox Code Playgroud)