0

我需要从一些原始文本数据格式化一个批量输入文件。我能够使用 来实现我的大部分解决方案Sed,这是首选,但不是绝对必需的(我只想坚持使用这个工具)。当我疯狂地尝试解析 [大量] 以下输入时,问题变得很明显:

---- Start Product ----
PartNumber>> 123457
Size04_Req>> 2 
Size02_Req>> 1 
PartColor>> Natural
PartDescription>> Guys Tee 
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
Size05_Req>> 1 
PartColor>> Natural
PartDescription>> Black Hoodie


---- End Product ----


###...with the objective of achieving the following output:


---- Start Product ---
PartNumber>> 123457
Size01_Req>> 0 
Size03_Req>> 0 
Size05_Req>> 0 
Size06_Req>> 0
Size04_Req>> 2 
Size02_Req>> 1 
PartColor>> Natural
PartDescription>> Guys Tee
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
Size01_Req>> 0 
Size02_Req>> 0 
Size03_Req>> 0 
Size04_Req>> 0 
Size06_Req>> 0
Size05_Req>> 1 
PartColor>> Natural
PartDescription>> Black Hoodie
---- End Product ----

我相信这就像在地址范围内工作一样简单/----\ Start\ Product\ ----/,/----\ End\ Product\ ----/并做一些优雅的分支和:label 工作,但显然我的倾向是跳上 awk 或其他东西来实现这个逻辑 - 因为我要疯了 - 也许用另一种工具来实现这一点会更容易。然而,我坚持我最初的愿望是留在 Sed,并且因为我喜欢每天学习一个新的 Sed 技巧,我该怎么做呢?请注意,逻辑是为未考虑的大小 01-06 插入SizeXX_Req>> 0 ,并且顺序并不重要,这就是为什么我认为 Sed 甚至可以半理智地完成最后一个小部分。总会有至少一个SizeXX_Req每个开始/最终产品部分之间的行。任何 Sed(i) 大师都能快速解决这个问题吗?我是否只是从我最近写的大量正则表达式中抽离出来而错过了一个简单的修复?

前进。用另一种随机语言给我看,甚至不用解释你是如何(或为什么)这样做的,我也对此感到失望。提前谢谢,偷看。

4

1 回答 1

0

对我来说,仅使用 sed 来执行此操作似乎是不可能的,因为您需要一个计数器和某种反向引用。也许我错了,无论如何,使用 Perl:

use warnings;
use strict;

my (%sizes, %part);
while(<>) {
  if (/^---- End Product ----/) {
    print "---- Start Product ----\n";
    print "PartNumber>> $part{Number}\n";
    for my $size (map { sprintf "%02d", $_ } 1..6) {
      if (not defined $sizes{$size}) {
        print "<b>Size${size}_Req>> 0</b>\n";
      }   
    }   
    for my $size (keys %sizes) {
      print "Size${size}_Req>> $sizes{$size}\n";
    }   
    print "Part$_>> $part{$_}\n" for ("Color", "Description");
    print "---- End Product ----\n";
    %sizes = (); 
    %part  = (); 
  }
  $sizes{$1} = $2 if (/^Size(\d+)_Req>>\s*(\d+)/);
  $part{$1} = $2 if (/^Part(\w+)>> (.*)/);
}

采用

perl script.pl input

输出

---- Start Product ----
PartNumber>> 123457
<b>Size01_Req>> 0</b>
<b>Size03_Req>> 0</b>
<b>Size05_Req>> 0</b>
<b>Size06_Req>> 0</b>
Size04_Req>> 2
Size02_Req>> 1
PartColor>> Natural
PartDescription>> Guys Tee 
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
<b>Size01_Req>> 0</b>
<b>Size02_Req>> 0</b>
<b>Size03_Req>> 0</b>
<b>Size04_Req>> 0</b>
<b>Size06_Req>> 0</b>
Size05_Req>> 1
PartColor>> Natural
PartDescription>> Black Hoodie
---- End Product ----
于 2013-03-20T02:23:52.303 回答