【问题标题】:Trouble in converting PCRE Regex to sed将 PCRE 正则表达式转换为 sed 时遇到问题
【发布时间】:2017-09-24 16:27:34
【问题描述】:

我在如何在 sed 中使用有效的 PCRE 正则表达式时遇到了麻烦。我找到了一个相关的topic,但不幸的是它对我不起作用(如果这应该是必要的信息,我正在使用 Linux 而不是 MacOS X)。 我有一些 HTML 代码,我需要一个特殊的部分——但不是在相同的标签之间。我拥有的正则表达式是根据一些正则表达式测试站点(如 regex101 或 regexr.com)工作的,但是,当尝试在 sed 上使用它时,它会显示整个文件而不是想要的部分。

我的正则表达式是:

/((<div id="main-content" class="wiki-content">)([\w\d\s\S]*))(<\/rdf:RDF>\n-->)/g

它抓取以特定 div 开头的部分并收集包括以下 RDF 部分在内的所有内容。

我正在处理的文本看起来(有趣的部分 - 由于长度原因我剪掉了周围的其余部分,而且这部分只出现在文件中)如下(包括间隙):

[...]
a href="#page-metadata-start" class="assistive">Go to start of metadata</a>
<div id="page-metadata-end" class="assistive"></div>



        <div id="main-content" class="wiki-content">

        <p><br/></p><p><br/></p><div class="panel conf-macro output-block" data-hasbody="true" data-macro-name="panel" style="border-color: #004237;border-width: 1px;"><div class="panelHeader" style="border-bottom-width: 1px;border-bottom-color: #004237;background-color: #004237;color: white;"><b>Inhalt</b></div><div class="panelContent">
<p> </p><div class="toc-macro client-side-toc-macro  conf-macro output-block" data-hasbody="false" data-headerelements="H1,H2,H3,H4,H5,H6,H7" data-macro-name="toc"> </div><p> </p>
</div></div><h1 id="id-01-Dokumentation-1EinstiegindiePlanung">1 Einstieg in die Planung</h1><p><br/></p><h2 id="id-01-Dokumentation-1.1Startseite">1.1 Startseite</h2><p>Nach der Anmeldung im System findet sich der User auf der Startseite wieder. Von hier aus gelangt er zur &quot;Planning Map&quot;.</p><p>Durch das Umschalten der Company auf die Counter Company kann der Planer die zuvor eingetragenen Werte kontrollieren. Diese erscheinen nach dem Umschalten in der zweiten<br/>Tabelle als negativer Wert auf dem gemappten IC Account.</p><p><br/></p><div class="table-wrap"><table class="wrapped confluenceTable"><colgroup><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Button</th><th class="confluenceTh">Aktion</th><th class="confluenceTh">Beschreibung</th></tr><tr><p>Alle Eintragungen werden auf der untersten Ebene (weißer Hintergrund) ausgeführt. Monate, die nicht mehr beplant werden können sind farblich hinterlegt. Ebenfalls farblich hinterlegt sind<br/>die Accounts, die hier nicht beplant werden können (IC / Capex und Rule belegte Accounts).</p><p><br/></p><div class="table-wrap"><table class="wrapped confluenceTable"><colgroup><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Button</th><th class="confluenceTh">Aktion</th><th class="confluenceTh">Beschreibung</th></tr><tr><td colspan="1" class="confluenceTd">Back</td><td colspan="1" class="confluenceTd">Sheet Wechsel</td><td colspan="1" class="confluenceTd">Zurück zum Sheet Planning Map</td></tr><tr><td colspan="1" class="confluenceTd">Refresh</td><td colspan="1" class="confluenceTd">Prozess ausführen</td><td colspan="1" class="confluenceTd">Sheet wird nochmals neu aufgebaut</td></tr></tbody></table></div>




        </div>

        <!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
         <rdf:Description
    rdf:about="https://confluence.example.org/confluence/display/KUN/01+-+Dokumentation"
    dc:identifier="https://confluence.example.org/confluence/display/KUN/01+-+Dokumentation"
    dc:title="01 - Dokumentation"
    trackback:ping="https://confluence.example.org/confluence/rpc/trackback/47022143"/>
</rdf:RDF>
-->
[...]

所以当我在提到的测试网站上尝试这个正则表达式时,它标志着我需要的部分(在&lt;div id="main-content" class="wiki-content"&gt;&lt;/rdf:RDF&gt;\n--&gt; 之间)。

但是当使用sed -r '/((&lt;div id="main-content" class="wiki-content"&gt;)([\w\d\s\S]*))(&lt;\/rdf:RDF&gt;\n--&gt;)/g' testfile.txt 时,它会向我显示完整的文件内容,而不是我正在寻找的部分(sed -E... 产生相同的内容)。

我无法解决我的问题所在,因此非常感谢任何帮助。另外,我不是专业的正则表达式用户...

【问题讨论】:

  • 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 我用 xmllint 试过了,但也没成功...

标签: html bash sed


【解决方案1】:

我不确定它在你的情况下会如何工作,因为我可能需要更多数据,但这个可能对你有用:

sed -ne '/<div id="main-content" class="wiki-content">/,/-->/{p}' file.html

【讨论】:

  • 就是这样 - 当场就击中它。非常感谢!
  • 对不起,我也在摆弄其他 RegEx,所以我没有看到评论。当然,如果你能向我解释一下它是如何工作的,那就太好了:-)
  • 标志 '-n' 告诉 sed 只打印已处理的行,/&lt;div id="main-content" class="wiki-content"&gt;/,/--&gt;/ 获取介于 &lt;div id="main-content" class="wiki-content"&gt;--&gt; 之间的所有行,包括这些行。这就像找到第一行,然后找到第二行,然后将包括这些行在内的所有内容都放在中间。而{p} 只是打印所有这些行。
  • 感谢您的解释 - 非常感谢。
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2020-07-30
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多