我的问题是相反的这个。
我的输入文件是位置和序列号的列表(如库存列表)。一些序列号被列为范围(例如,11-17),我需要将每个范围转换为完整的序列号列表(例如,11、12、13、14、15、16、17)。
输入格式是这样的:
Main Street # 12770-12786, 12980, 13012-13013, 13068, 13093, 13115, 13122, 13137-13156, 13548-13557, 13954-13969, 14471-14475, 14500-14508
Madison Ave # 14071-14074, 14105-14128, 14131-14140, 14603-14612
每个位置由空行分隔。每个位置都以名称开头。到目前为止,我只看到过包含[a-zA-Z -]
大小写字母、空格和破折号的名称。该名称从新行的第 0 列开始,后跟一个空格、一个哈希值和一个空格:#
。
对于格式中的每个范围nnnn-mmmm
,我需要生成一个逗号(和空格)分隔的顺序值列表,例如n1, n2, n3, n4, n5
.例如,Madison Ave(上图)的库存需要按如下方式列出:
Madison Ave # 14071, 14072, 14073, 14074, 14105, 14106, 14107, etc.
输入是一个文本文件,输出可以是一个文本文件。我想在 bash 中进行处理,但我想我也可以使用 Python。
我知道解决方案的一些可能的部分,例如:
使用 grep 使用正则表达式模式查找范围,如下所示:
grep -o -P '\d+-\d+'<input_file>
假设第一个结果是范围
4243-4263
echo {4243-4263} | sed 's/-/../'
对上面的结果使用 for 循环,如下所示:
for i in {4243..4263}; do echo $i; done
我不知道如何将所有这些整合到一个解决方案中。我还认为可能有更好的方法来解决这个问题。
答案1
佩尔怎么样?
- 匹配由一个或多个数字组成的每个序列,后跟破折号,后跟一个或多个数字
(\d+)-(\d+)
- 将捕获数字序列重写为
nnnn...mmmm
括号内的perl 范围表达式 - 将结果计算为 perl 表达式,创建一个数组,然后将其连接起来以生成适当分隔的字符串
所以
$ perl -pe 's/(\d+)-(\d+)/join ", ", ($1..$2)/ge' input
Main Street # 12770, 12771, 12772, 12773, 12774, 12775, 12776, 12777, 12778, 12779, 12780, 12781, 12782, 12783, 12784, 12785, 12786, 12980, 13012, 13013, 13068, 13093, 13115, 13122, 13137, 13138, 13139, 13140, 13141, 13142, 13143, 13144, 13145, 13146, 13147, 13148, 13149, 13150, 13151, 13152, 13153, 13154, 13155, 13156, 13548, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13954, 13955, 13956, 13957, 13958, 13959, 13960, 13961, 13962, 13963, 13964, 13965, 13966, 13967, 13968, 13969, 14471, 14472, 14473, 14474, 14475, 14500, 14501, 14502, 14503, 14504, 14505, 14506, 14507, 14508
Madison Ave # 14071, 14072, 14073, 14074, 14105, 14106, 14107, 14108, 14109, 14110, 14111, 14112, 14113, 14114, 14115, 14116, 14117, 14118, 14119, 14120, 14121, 14122, 14123, 14124, 14125, 14126, 14127, 14128, 14131, 14132, 14133, 14134, 14135, 14136, 14137, 14138, 14139, 14140, 14603, 14604, 14605, 14606, 14607, 14608, 14609, 14610, 14611, 14612