0

我想通过以下方式从文件中找到丢失的对:

<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)。

4

3 回答 3

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)
于 2013-05-27T09:07:56.873 回答
2

使用GNU grepuniq

$ grep -Po '(?<=id[AB]=")[0-9]+' file | uniq -u
313

如果您的输入未按排序顺序:

$ grep -Po '(?<=id[AB]=")[0-9]+' file | sort -n | uniq -u
313
于 2013-05-27T09:44:21.047 回答
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

可用于遍历整个输入。

于 2013-05-27T09:24:15.990 回答