批量在html中找到一行并在其下面添加一些文本

时间:2011-08-08 10:11:22

标签: html batch-file find

我正在努力争取这几个小时,但我无法让它正常工作。我想做的是找到一条线

<div id="content"> 

并添加以下几行,其中包含一些变量,如

<div class="post">
    <h2 class="title"><a href="#">**var**</a></h2>
    <p class="meta"><span class="date">**var**</span>
    <span class="posted">Posted by <a href="#">**var**</a></span></p>
    <div style="clear: both;">
        &nbsp;
    </div>
    <div class="entry moreless">
        **var** 
    </div>
</div>

有可能吗?如果是这样的话?

- 大卫

1 个答案:

答案 0 :(得分:2)

更好的工具可用于解决此问题。但是有可能使用Windows批处理!

假设下面的文本是名为TEMPLATE.HTML的最外层模板文件。内容触发器行可以缩进,但此解决方案在触发器后不允许使用额外的字符。 (这个限制可以解决,但会减慢速度)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Sample template for building a page</title>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>
  <div id="content">
  </div>
</body>
</html>

下面的示例内容文件(名为CONTENT_HTML.TXT)包含指定为!varName的变量!并且批处理文件将使用延迟扩展来执行变量替换。这意味着如果您希望内容包含感叹号,则必须以某种方式对其进行编码。有两种选择。一种是使用HTML字符符号&amp;#33;这适用于文本内容,但如果您想要HTML注释则无效。对于评论,我定义了一个!X!将扩展为的变量!

<div class="post">
    <h2 class="title"><a href="#">!TITLE!</a></h2>
    <p class="meta"><span class="date">!DATE!</span>
    <span class="posted">Posted by <a href="#">!AUTHOR!</a></span></p>
    <div style="clear: both;">
        &nbsp;
    </div>
    <div class="entry moreless">
        Example with exclamation point&#33;<br />
        Another example with exclamation point!X!
    </div>
    <!X!--
      sample comment
    -->
</div>

最后,这是一个批处理文件,它将所有内容放在一起并创建一个名为FINAL.HTML的输出文件。我对变量的值进行了硬编码,但它们可以很容易地作为参数传递。

@echo off
setlocal enableDelayedExpansion
set X=^^^!
set TITLE=Sample HTML build
set DATE=%date%
set AUTHOR=Santa Clause
set TEMPLATE="template.html"
set CONTENT="content_html.txt"
set FINAL="final.html"

<%TEMPLATE% (
  for /f %%A in ('type %TEMPLATE%^|find /c /v ""') do (
      for /l %%N in (1 1 %%A) do (
      set "ln="
      set/p "ln="
      echo(!ln!
      set "test=!ln:*<=<!"
      if "!test!"=="<div id="content">" (
        for /f "usebackq delims=" %%L in (%CONTENT%) do echo(%%L
      )
    )
  )
)>%FINAL%

此解决方案存在一些限制

  1. 将从“内容”部分中删除空行(仅包含空格的行)。可能不是HTML的问题。消除此限制会使解决方案变得复杂和变慢。
  2. 行开头;将从内容部分中删除。这个限制很容易删除,但代码看起来很难看。它涉及指定&lt; LF&gt;作为最终FOR / F循环中的EOL字符。
  3. 模板文件必须使用&lt; CR&gt;&lt; LF&gt;的Windows换行标准。使用&lt; LF&gt;的Unix样式文件将失败的这个解决方案。这也可以解决,但同样会使事情变得复杂和缓慢。
  4. 正如我之前所说,模板中的内容触发器可以有前导空格,但它不能在行上有任何尾随字符。删除此限制将减慢该过程。
  5. 模板
  6. 中的行数限制为1024个字符
  7. 从模板
  8. 中的每一行删除尾随控制字符