从BASH脚本

时间:2016-01-11 22:15:26

标签: html bash replace sed

我有许多HTML文件,它们具有我想要替换的相同部分:

  <div id="main-content" class="span12">
    <h1 id="404-page-not-found" style="text-align: center">404</h1>
    <p style="text-align: center"><strong>Page not found</strong></p>
    <p style="text-align: center"><a href=".">Home</a></p>
  </div>

我想用{{NAV}}

替换此代码

我觉得我可以这样做:

bash脚本:

#!/bin/bash
find -name '*.html' | while read FILE; do
    sed --in-place -f replace.sed "$FILE"
done

replace.sed:

<my code above here>{
    r replacement
    d
}

替换:

{{NAV}}

但我无法获取我想要的代码并在replace.sed中替换正确。

有人能想出更好的方法或如何正确格式化我的代码吗?

1 个答案:

答案 0 :(得分:1)

如果您用此替换replace.sed,它应该有效:

/<div id="main-content" class="span12">/ {  # If we match the first line
    :x               # Label to branch to
    N                # Read next line into pattern buffer
    /<\/div>$/! bx   # If we don't match the closing tag, branch to x
    c \{{NAV}}       # Replace the pattern buffer with {{NAV}}
}

如果第一行和最后一行足以唯一标识要替换的html片段,则此方法有效。如果你想完全匹配整个片段,你可以这样做:

/^<div id="main-content" class="span12">/ {
    N
    /<h1 id="404-page-not-found" style="text-align: center">404<\/h1>/! b
    N
    /<p style="text-align: center"><strong>Page not found<\/strong><\/p>/! b
    N
    /<p style="text-align: center"><a href=".">Home<\/a><\/p>/! b
    N
    /<\/div>$/ c \{{NAV}}
}

这个工作原理如下:

  • 如果第一行匹配,请加载下一行(N
  • 如果模式空间现在与第二行不匹配,则跳转到循环结束(b)并打印模式空间,否则加载下一行
  • 重复第三和第四行
  • 如果现在结束标记位于图案空间的末尾,请将整个图案空间替换为{{NAV}},否则只需将其打印