[英]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结构中搜索诸如属性或值之类的特定元素,则可以使用xsltproc
或xmllint
。
如果您只需要在同一句子中添加一些“给X或Y的行”,则可以执行以下操作:
grep -E 'X|Y' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.