【问题标题】:Using sed - how to replace two HTML tags or patterns with unknown content in-between?使用 sed - 如何用中间的未知内容替换两个 HTML 标记或模式?
【发布时间】:2018-10-30 04:03:10
【问题描述】:

我想保留标签之间的未知内容,但想匹配所有使用的标签:

<div class="section1-title">arbitrary content here</div>

并将周围的标签替换为:

<h2>arbitrary content here</h2>

我想出了以下内容,但显然它不起作用,因为在第二部分中它实际上是用 "].*[]" 替换找到的每个匹配项。

sed -i 's/[<]div class=\"section1-title\"[>].*[<]\/div[>]/<h2[>].*[<]\/h2[>]/g'

我特别想知道如何保持中间内容完好无损,无论里面有什么,并且只匹配那些周围的标签,因为显然有很多元素,所以我不能单独搜索和替换他们。据我所知,sed 语句的第一部分似乎确实与正确的内容相匹配,但我不确定主要是第 2 部分。

【问题讨论】:

  • 始终建议使用正确的工具进行 HTML 解析 sedawk 不适用于 HTML 解析。
  • 您会推荐哪些工具?
  • 为什么不建议将 sed 或 awk 用于这些目的?

标签: linux bash awk sed


【解决方案1】:

你需要的是一个反向引用。

    bash-3.2$ sed 's/<div class=\"section1-title\">\(.*\) 
    <\/div>/<h2>\1<\/h2>/g' <<< '<div class="section1-title">arbitrary 
    content here</div>'
    <h2>arbitrary content here</h2>

您的内容周围的括号 - \(.*\) - 允许稍后引用它,就像 \1 一样。

见:https://www.regular-expressions.info/backref.html

.bash_profile sed: \1 not defined in the RE 解释为什么括号应该在你的正则表达式中转义。

【讨论】:

  • 谢谢!这就是我一直在寻找的东西,也是一个很好的资源。不过,我发现正则表达式非常贪婪,并且在“section1-title”的第一次出现和其他几个
    之后的内容之间吞噬了内容。我自己研究了一下,但是你有没有建议让它在
    的第一场比赛中停止?
  • 您可能希望使用? 使其成为惰性匹配而不是贪婪匹配 - \(.*?\) - 这将匹配 &lt;\/div&gt; 之前的最少字符。或者一个否定的字符类可能更有意义——比如\([^&lt;]*\)——它将匹配尽可能多的非&lt;字符。 (另见regular-expressions.info/repeat.html
  • 我尝试了第二个,但是有一些标签包含我想离开的 类。使用 ?非常完美,完全符合我的需要。非常感谢您的帮助!绝对学到了很多东西以供将来参考。
  • 猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2012-04-04
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多