macOS系统下如何通过XPath从XML中获取换行分隔的匹配内容
macOS低版本xmllint XPath多结果换行输出解决方案
针对libxml2版本低于20909时,xmllint的--xpath参数输出多文本结果直接拼接无分隔的问题,可使用以下几种方案:
方案1:使用xmllint shell模式输出(无需额外安装工具)
通过shell模式的cat命令查询节点,再过滤掉输出中的额外格式行即可:
echo 'cat //foo[@bar="baz"]/text()' | xmllint --shell my.xml | awk '!/^\/ >/ && !/^ -------/'
输出结果:
Lorem Ipsum Dolor Amet
方案2:修改XPath表达式手动追加换行
在XPath中给每个匹配到的文本后拼接换行符,适配自带的低版本libxml2:
xmllint --xpath '//foo[@bar="baz"]/concat(text(), "\n")' my.xml
方案3:安装高版本libxml2(一劳永逸)
macOS自带的libxml2版本偏旧,可通过Homebrew安装最新版本,20909及以上版本默认就会在多个XPath结果之间添加换行分隔:
# 安装最新版libxml2 brew install libxml2 # 临时使用brew版本的xmllint $(brew --prefix libxml2)/bin/xmllint --xpath '//foo[@bar="baz"]/text()' my.xml # 如果需要默认使用,可把对应路径加入环境变量,比如在~/.zshrc中加入 export PATH="$(brew --prefix libxml2)/bin:$PATH"
方案4:通过文本处理命令拆分输出
也可以先输出完整匹配元素再提取文本:
xmllint --xpath '//foo[@bar="baz"]' my.xml | sed -E 's/<foo[^>]*>([^<]*)<\/foo>/\1\n/g' | grep -v '^$'
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

