1

我很困惑为什么这个 sed 命令不起作用:

sed 's/<script id="live-reload"[\s\S]*?<\/script>/test/g' www_public/index.html > www_public/index.html.temp

它应该将以下 HTML 的 live-reload 脚本标记替换为“test”:

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>

        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>AssembleJS</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">

        <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
        <link rel="stylesheet" href="assets/css/main.css">

    </head>

    <body>

        <script id="require-lib" data-main="src/config" src="src/libs/require.js"></script>

        <script id="live-reload">document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script>

        <script id="test"> bla bla bla </script>

    </body>

</html>

这是正则表达式的工作:

http://regexr.com?339ga

4

1 回答 1

3

您需要使用-rfor,?因为它是扩展的正则表达式:

$ sed -r 's/<script id="live-reload".*?<\/script>/test/g' file

或逃避它:

$ sed 's/<script id="live-reload".*\?<\/script>/test/g' file

输出:

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>

        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>AssembleJS</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">

        <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
        <link rel="stylesheet" href="assets/css/main.css">

    </head>

    <body>

        <script id="require-lib" data-main="src/config" src="src/libs/require.js"></script>

        test

        <script id="test"> bla bla bla </script>

    </body>

</html>

笔记:

  • 也更改[\s\S]*?为,.*?因为它们是免费团体。

  • g标志仅对单行上的多个匹配项是必需的。

  • 如果您正在运行 Mac,请检查扩展的正则表达式选项-r-Esed --help

  • 强制不要使用解析器解析带有正则表达式警告的 [x]html。

于 2013-01-01T19:25:10.703 回答