【问题标题】:Replace all instances of a character inside a specific HTML element/tag替换特定 HTML 元素/标签内的所有字符实例
【发布时间】:2011-09-07 13:26:54
【问题描述】:

Adobe Dreamweaver 的搜索和替换功能将其范围限制为“仅在 xxxx HTML 标记内部”。

我想用 Mac OS X 的命令行来做这件事(所以会做任何与它捆绑在一起的东西)。

例如,如何使用命令行删除所有<h1> 中字符“a”的所有实例?

【问题讨论】:

  • 你能提供一个具体的例子来说明你想要改变什么吗?
  • 例如,删除

    lot-s of hy-pen-s to e-lim-i-nate

    内的所有连字符实例,但不在任何其他标签内。跨度>

标签: html regex macos dreamweaver replace


【解决方案1】:

您可以使用 unix 的 sed 命令(也可以在 mac 上使用)。 例如

$ cat foo.xml 
<h1>axyzabca</h1>
<a href="foo.com">abc</a>
<h1>aa</h1>
<h1>a</h1>
<h1></h1>

$ cat foo.xml | sed 's/<h1>a*\([^a]*\)a*\([^a]*\)a*<\/h1>/<h1>\1\2<\/h1>/g' 
<h1>xyzbc</h1>
<a href="foo.com">abc</a>
<h1></h1>
<h1></h1>
<h1></h1>

(foo.xml 是一个包含常见测试用例的示例输入)

【讨论】:

  • 我必须补充一点,除非您在编辑代码时这样做,否则使用正则表达式处理 xml/html 通常是个坏主意。请参阅codinghorror 了解原因。
  • 这不会只是删除一些 a 开头的确切模式,一些在中间,还有一些在结尾(也就是说,恰好 3 组,不少于,不少于)?
  • 不确定你的意思。我给出的示例 xml 和示例运行显示了不同的情况。无论如何,重点是向您展示如何使用 sed 来做到这一点。您可以根据您的特定用例调整正则表达式。
【解决方案2】:

这不是单行的,但是--

perl -ni -e '
    $/ = undef; $x = <>; $y = "";
    while ($x =~ m#^(.*?<h1>)(.*?)(</h1>)(.*)$#si) {
      $x = $4; $y .= $1; $c = $3;
      ($b = $2) =~ s/a/(something else)/g;
      $y .= $b . $c;
    } print $y . $x;
' filename.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 2016-01-14
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多