文件中存在多个代码片段,类似于以下内容:
<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 中,这只是一个测试。