【问题标题】:Shell scripting to perform regex match/replace执行正则表达式匹配/替换的 Shell 脚本
【发布时间】:2010-06-11 02:26:41
【问题描述】:

我正在使用 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) 将所有正则表达式匹配保存到新文档或返回到原始文档

非常感谢“集体”的任何意见。

【问题讨论】:

    标签: regex shell


    【解决方案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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2014-05-12
      • 2013-12-06
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多