繁体   English   中英

使用Shell脚本查找在某些条件下xml中存在的多个属性

[英]Finding multiple attributes present in an xml with certain conditions using shell scripting

grep -R --include="*.xml" "Frontal Face" /home/ashutosh/Desktop/imgdone | grep -v "Non Frontal Face"

该命令为我提供了存在“正面”的所有xml。 如果我想通过此Shell脚本搜索更多属性,例如“ Happy”,“ Young”(出现在xml中),我应该对此做哪些更改?

综上所述,如何搜索多个属性?

正如您对上一个问题的答案和注释中已经指出的那样,这里没有任何内容支持专门搜索XML属性。 正如已经多次指出的那样, grep并不是搜索结构化格式的好工具。

如果您的问题只是“如何在文件的任何位置找到X,Y或Z”,那么这很简单; grep -E 'X|Y|Z' files 但这并不能排除不属于XML属性的匹配项,也不能找到由于某种原因而被XML功能遮盖的匹配项(例如X也可以有效地表示为X或此类型的许多变体)。 再一次,这之前已经向您指出过。

虽然可以将XPath表达式写为“在解析的元素树中使用属性值为'baz'或'quux'查找任何元素”,但这并不是真正的明智要求。 通常,您希望使用类似“在树中找到bar属性为'baz'或'quux'的任何foo元素,即匹配正则表达式^(baz|quux)$内容,例如

//foo/@bar[matches(.,'^(baz|quux)$')]

matches()谓词是XPath 2.0的功能。

你会用它像

find /home/ashutosh/Desktop/imgdone -type f -name '*.xml' -exec \
    xmllint --xpath '//foo/@bar[matches(., "^(baz|quux)$")]' {} \;

如果你的shell是够新,可以删除find命令,并且只使用递归通配符像/home/ashutosh/Desktop/imgdone/**/*.xml作为文件名参数xmllint

如果您没有xmllint ,请寻找xmlstarlet或其他任何XPath工具; 目前还没有一个普遍存在的标准实用程序。

正如Tripleee指出的那样,如果您需要在xml结构中搜索诸如属性或值之类的特定元素,则可以使用xsltprocxmllint

如果您只需要在同一句子中添加一些“给X或Y的行”,则可以执行以下操作:

grep -E 'X|Y' file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM