【问题标题】:Sed: Modify lines in a HTML file based on multiple pattern matchesSed:根据多个模式匹配修改 HTML 文件中的行
【发布时间】:2014-01-05 05:05:22
【问题描述】:

我需要弄清楚如何执行以下操作,并且想知道是否有人可以就 sed 的良好做法提供任何建议,或者更重要的是坏做法,这将有助于我完成这项任务。

基本上,我想逐行浏览文件并在 PATTERN1 上查找匹配项。一旦我找到匹配项,我想查找与 PATTERN2 匹配的下一行。如果我得到一个 PATTERN2 匹配,我想继续下一个 PATTERN1 匹配。如果我没有 PATTERN2 的匹配项,我想修改下一次出现的 PATTERN3 并对其进行修改。最后在 PATTERN2 或 PATTERN3 匹配时修改 PATTERN1 的所有匹配。

以下面为例:

    <tr>
  <td>
<input type="text" id="record_511568" value="PATTERN1" style="width:200px">
  </td>
  <td>2001-06-29 18:38:21</td>
  <td>2014-06-29 18:38:21</td>
  <td>
    <select id="status_511568">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
<option value="4">4</option>
    </select>
  </td>
</tr>

我想匹配 PATTERN1 并检查下一次出现的 PATTERN2 (1)。

如果 PATTERN2 匹配,我想将其更改为 (&lt;option value="1" selected="selected"&gt;1&lt;/option&gt;)

如果 PATTERN2 不匹配,那么我想确保它匹配 PATTERN3 (&lt;option value="1" selected="selected"&gt;1&lt;/option&gt;)

通过每个 PATTERN1 逐步执行此操作。基本上将大型 HTML 表单修改为我在列表中预先确定的值。关于我可能遇到的一些陷阱的任何想法或关于与sed 进行多模式匹配的建议。

【问题讨论】:

  • 您真的不想使用 SED 解析 HTML 或 XML 等标记语言。即使你设法回过头来理解你写的东西。这是 perl、python 或其他编程语言的工作。如果您必须使用最古老和最笨拙的工具来解决这个问题,请尝试使用 awk 或 gawk。
  • 或者您可以使用带有 xml 扩展名的 hxextract 或 gawk
  • 在上面的例子中,我只看到pattern1 而没有看到pattern2。这不是sed 的工作。如果你有sed,你通常也会有awk。它更适合这种类型的逻辑。
  • 必读答案@jordanm 已阅读、理解并牢记在心。我从一开始就错误地处理了这项任务,我想我会尝试使用 Javascript 进行修改

标签: regex bash sed


【解决方案1】:

如果您想避免不良做法,请不要为此使用sed。这里有一个很棒的解释:

RegEx match open tags except XHTML self-contained tags

使用具有适当 HTML 或 XML 解析库的编程语言。

如果您不想遵循良好做法并且不介意使用一些不良做法,请编辑您的问题以明确说明。

【讨论】:

    【解决方案2】:

    如果您的 HTML 是有效的 XML,您也可以尝试 XSLT。

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2019-02-20
      • 2022-01-07
      • 2017-05-01
      相关资源
      最近更新 更多