我什至不知道如何问这个问题,所以请耐心等待。我有一个(主要是)字母数字列表,它们在一个巨大的 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
这正是我所需要的。事实证明,接下来我需要弄清楚的两个实例将从这种新方法中受益,所以谁知道这节省了我多少小时?