仅显示使用regex找到的结果类型的一个实例

时间:2012-12-07 19:33:26

标签: regex sorting cygwin

我不知道如何问这个问题所以请耐心等待。我有一个(大多数)alpha-numerics列表,它在一个巨大的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}

等等。我希望有足够的信息以可行的形式呈现问题。就像我说的那样,我甚至不知道如何构建这个问题,而且经常在我写到问题的时候,我实现了一个解决方案&amp;甚至不提交,但这个让我难过。

更新 使用@ 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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

nnnnnx

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