我想通过以下方式从文件中找到丢失的对:
<itemA>
<idA="312" />
</itemA>
<itemB>
<idB="312" /> # has a corresponding itemA
</itemB>
<itemB>
<idB="313" /> # doesn't have a corresponding itemA
</itemB>
我什至不完全确定要使用什么工具(sed、awk、grep)。
试试这个脚本:
#!/bin/bash
grep -oP '(?<=idA=")[0-9]+' input.xml | sort > a.txt
grep -oP '(?<=idB=")[0-9]+' input.xml | sort > b.txt
diff -y a.txt b.txt
以下将消除创建临时文件的需要:
diff -y <(grep -oP '(?<=idA=")[0-9]+' input.xml) <(grep -oP '(?<=idB=")[0-9]+' input.xml)
使用GNU grep
和uniq
:
$ grep -Po '(?<=id[AB]=")[0-9]+' file | uniq -u
313
如果您的输入未按排序顺序:
$ grep -Po '(?<=id[AB]=")[0-9]+' file | sort -n | uniq -u
313
通常,您的任务将需要一个 XML 解析器,因为可以自由地格式化 XML。您的输入也可能如下所示
<itemA>
<
idA
=
"312" />
</itemA>
<itemB>
<
idB
=
"312" /> # has a corresponding itemA
</itemB>
<itemB>
<
idB
=
"313" /> # doesn't have a corresponding itemA
</itemB>
并且仍然是与您的示例具有相同含义的有效 XML。在没有适当的 XML 解析器的情况下解析这个(以及我没有指出的其他可能的问题)是一项徒劳的任务。
但是,如果您对输入的格式了解得更多,而不仅仅是知道它是有效的 XML,那么您当然可以使用 grepping 来查找匹配对。
例如,如果您知道格式始终与您发布时一样,
valueA=""
grep '<id[AB]=' | while true
do
if [ "$valueA" = "" ]
then
IFS='=' read dummy valueA
fi
IFS='=' read dummy valueB
if [ "$valueA" != "$valueB" ]
then
echo "Missing B for $valueA"
valueA=$valueB
else
valueA=""
fi
done
可用于遍历整个输入。