Shell脚本执行正则表达式匹配/替换

时间:2010-06-10 16:52:31

标签: regex shell

我正在使用cURL获取网页并向我们的用户展示。事情一直很好,直到我使用大量格式化的Ajax来访问一个网站:

33687|updatePanel|ctl00_SiteContentPlaceHolder_FormView1_upnlOTHER_NATL|
                                        <div id="ctl00_SiteContentPlaceHolder_FormView1_othernationalities">
                                            <h4>

                                                <span class="tooltip_text" onmousemove="widetip=false; tip=''; delayToolTip(event,tip,widetip,0,0);return false"
                                                    onmouseout="hideToolTip()">
                                                    <span id="ctl00_SiteContentPlaceHolder_FormView1_lblProvideOTHER_NATL">Provide the following information:</span></span>
                                            </h4>
|
266|scriptBlock|ScriptContentNoTags|
    document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL').dispose = function() {
        Array.remove(Page_Validators, document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL'));
    }

因此,响应的每个部分是4个部分:2和3只是标识符,4是真正的“身体”,1是身体的长度。问题在于我们修改了主体,我需要能够更新第一部分的长度来表示;否则,我们在将其插入网页时会抛出一个解析错误。

我正在尝试找出shell命令(awk,sed等)的组合: a)读取保存的文件 b)对它运行正则表达式以收集每个单独的信息块(使用'(\ d *?)\ |(。?)\ |(。?)\ |(。*?)\ | “) c)使第一个捕获组等于最后一个捕获组的长度 d)将所有正则表达式匹配保存到新文档或返回原始文档

来自“集体”的任何意见都将非常感激。

1 个答案:

答案 0 :(得分:1)

看起来RegEx的单行不会解决这个问题,因为没有办法在{braces}之间放置第一个捕获的括号来表示长度。这是我认为理想的:

(\d*?)\|([^|]+)\|([^|]+)\|(.{\1})\|

该值也不能被绕过,因为在存在|的情况下没有转义字符的指示消息体中的某个地方。我建议直接拆分'|'并使用二维数组来存储内容。检查每个第四项是否匹配长度,如果太短,则连接|和下一个项目,然后递增读取计数器。 PHP应解释:

$items=explode('|', $file)
$len=count($items);
$oi=0;
$ol=-1;
for($i=0;$i<$count;++$i){
  $output[$oi][++$ol]=$items[$i];
  if($ol==3){
    $target=$output[$oi][0];
    while(strlen($output[$oi][3])<$target){
      $output[$oi][3].='|'.$items[++$i];
    }
    ++$oi;
    $ol=-1;
  }
}