我想以下列方式从文件中找到丢失的对:
<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)。
答案 0 :(得分:2)
试试这个脚本:
#!/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)
答案 1 :(得分:2)
使用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
答案 2 :(得分:0)
通常,您的任务需要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
可用于迭代整个输入。