查找文件中标签的重复实例

查找文件中标签的重复实例

文件中存在多个代码片段,类似于以下内容:

<blah>Spread the peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> on good looking bread <ramout assot="f0123_fun10" bapel="3 or 5"/> that does not have peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> already on the bread this that and the other <ramout assot="f0123_fun10" bapel="4"/> with something else.</blah>

我试图在单个文件中查找 ramout 标记的重复实例。如果存在以下情况:

<ramout assot="f0123_fun10" bapel="2 or 6"/> 

我想知道它是否在开头和结尾的废话标签中再次重复。

我尝试了多种方法,但最新的方法之一如下:

grep -Eoi '<blah>.*([[:space:]]<ramout assot).*\1.*</blah>' *.xml | less

什么也没返回。

我也尝试过:

 grep -Eio '<blah>.*([[:space:]]<ramout assot="[a-z][0-9]{5}_fig[0-9]+" bapel="[0-9]+.*)' *.xml

其中不包括反向引用,但也没有显示所有结果。看起来这只是显示一行的结果(不跨越多于一行)。

如果我想搜索可能或可能不在一行的内容,我应该使用 sed 吗?

awk 是一个可行的候选者吗?我看到并尝试了: awk '/Startpattern/,/Endpattern/' filename 返回了更多结果,但我仍然没有得到所有结果。

如能提供任何帮助,能够找到 a) 整个文件中的所有结果以及分别找到 b) blah 标签内重复的所有结果,我们将不胜感激。

预期结果类似于:

搜索结果 a) 显示所有 ramout 结果:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="3 or 5"/>
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/>

显示重复结果的搜索 b) 的结果将显示:

<ramout assot="f0123_fun10" bapel="2 or 6"/>

答案1

使用XML小星(有时安装为xmlstarlet而不是仅仅xml)提取相关标签,然后sort查找uniq重复项:

$ xml sel -t -m '/blah/ramout' -c '.' -nl test.xml | sort | uniq -d
<ramout assot="f0123_fun10" bapel="2 or 6"/>

xml命令将匹配<ramout>该标签正下方的所有标签<blah>,并将每个标签复制到标准输出,后跟换行符。

sort排序并uniq -d从 的输出中提取任何重复的条目sort

答案2

像这样的东西在我的测试中工作正常:

awk -F"/>" -v RS="<ramout assot=" 'NR>1{print RS $1 FS}' file1

echo "Finding Cuplicates:"
awk -F"/>" -v RS="<ramout assot=" 'NR==1{next}seen[$1]++==1{print RS $1 FS}' file1

<ramout assot="f0123_fun10" bapel="2 or 6"/> 
<ramout assot="f0123_fun10" bapel="3 or 5"/> 
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/> 
Finding Cuplicates:              
<ramout assot="f0123_fun10" bapel="2 or 6"/>  

在这里在线测试一下

我们利用 awk 功能来声明自定义记录分隔符 (RS) 和自定义字段分隔符 (FS)。上面两个命令可以组合在一个 awk 中,这只是一个测试。

相关内容