1

我什至不知道如何问这个问题,所以请耐心等待。我有一个(主要是)字母数字列表,它们在一个巨大的 XML 中绘制数字,我正在为其调整架构。关于它们的创建方式似乎没有标准,所以我正在尝试创建一个 XSD 正则表达式模式供他们验证。通常情况下,我只是磨碎它们,但在这种情况下,它们有数百个。我想要做的是将它们隔离为每种类型的图纸编号的单个实例,然后我可以在 XSD 中创建一个带有适当 OR 语句的正则表达式。

我的环境是 Win7,但我有一个 Ubuntu VM 和 Cygwin(我目前正在做这一切)。我不知道是否有可以做到这一点的 Linux 实用程序,或者我的 grep/sed-fu 是否很弱。我不知道如何减少这个问题,除非通过蛮力(我已经为这个拼图的其他部分做了没有这个大的部分)。

我使用这个命令行语句来获取绘图“数字”。它查找图纸编号,对它们进行排序,只给我唯一的,然后去掉封闭的标签:

grep "DrawingNumber" uber.xml | sort | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' 

这是一些实际绘图“数字”的示例(还有数百个):

10023C/10024C *<= this is how it's represented in the XML & I can't (easily) change it.
10023C
10043E
10051B
10051D
10058B
10059C
10447B 10447B *<= this is how it's represented in the XML & I can't (easily) change it.
10064A
10079B
10079D
10082B
10095A
10098B
10100B
10102
10109B
10109C
10115
101178
10118F

我想要的是一个列表,它将图纸编号列表减少为每种类型的单个实例。例如,这组绘图“数字”:

10023C
10043E
10051B
10051D
10058B
10059C

将减少为:

nnnnnx 

表示所有 5 位数字后跟一个字母的实例,我可以为其创建如下模式:

[0-9]{5}[a-z A-Z]{1}

相似地,

10102
10115

将减少为:

nnnnn

这将代表 5 位数字的所有实例,后面没有任何内容,并通过以下方式捕获:

[0-9]{5}

等等。我希望这些信息足以以可行的形式呈现问题。就像我说的那样,我什至不知道如何提出问题,而且当我经常在 SO 中写一个问题时,我意识到了一个解决方案,甚至不提交它,但是这个让我很难过。

更新: 使用@nullrevolution 的答案,这就是我想出的(这澄清了我下面的评论,这在很大程度上是不可读的)。

我最终使用的命令行是:

grep "DrawingNumber" uber.xml | sort -d | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' | sort -u

在看起来像这样的数据上:

<DrawingNumber>10430A</DrawingNumber>
<DrawingNumber>10431</DrawingNumber>
<DrawingNumber>10433</DrawingNumber>
<DrawingNumber>10434</DrawingNumber>
<DrawingNumber>10443A</DrawingNumber>
<DrawingNumber>10444</DrawingNumber>
<DrawingNumber>10446</DrawingNumber>
<DrawingNumber>10446A</DrawingNumber>
<DrawingNumber>10447</DrawingNumber>
<DrawingNumber>10447B 10447B</DrawingNumber>
<DrawingNumber>10447B</DrawingNumber>
<DrawingNumber>10454A</DrawingNumber>
<DrawingNumber>10454B</DrawingNumber>
<DrawingNumber>10455</DrawingNumber>
<DrawingNumber>10457</DrawingNumber>

这给了我一个通用的输出(对于我的所有数据,而不是上面的片段):

nnnnn
nnnnnn
nnnnnx
nnnnnx nnnnnx
nnnnnx/nnnnnx
nnxxx

这正是我所需要的。事实证明,接下来我需要弄清楚的两个实例将从这种新方法中受益,所以谁知道这节省了我多少小时?

4

1 回答 1

2

尝试先剥离封闭标签,然后:

sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' file | sort -u

它将用“n”替换所有字母,用“x”替换所有数字,然后删除所有重复项。

针对您的示例输入文件运行,输出为:

nnnnnx

如果这不可行,那么您能否以原始形式共享输入文件的一部分?

于 2012-12-07T20:01:50.943 回答