【问题标题】:Remove newline before a match - Linux在匹配之前删除换行符 - Linux
【发布时间】:2018-07-19 23:27:50
【问题描述】:

我想使用 Linux 命令(sedawk...)在我的 HTML 文件中删除 </script> 之前的换行符。

示例输入:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>JavaScript Ders 2</title>
        <script type="text/javascript" src="script1.js" language="javascript"> 
        </script>
        <script type="text/javascript" src="script2.js" language="javascript"> 
        </script>
        <script>
            // script kodumuz buraya yazılacak
        </script>
    </head>
    <body>
        <script type="text/javascript" src="script3.js" language="javascript"> 
        </script>
    </body>
</html>

样本输出:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>JavaScript Ders 2</title>
        <script type="text/javascript" src="script1.js" language="javascript"> </script>
        <script type="text/javascript" src="script2.js" language="javascript"> </script>
        <script>
        // script kodumuz buraya yazılacak</script>
    </head>
    <body>
        <script type="text/javascript" src="script3.js" language="javascript"> </script>
    </body>
</html>

我尝试了不同的语法,但没有一个能做到。

【问题讨论】:

标签: linux bash awk sed


【解决方案1】:

首先,如cmets中提到的Don't parse XML with Regex!永远不要这样做,永远不要考虑它。养成不去想的习惯!有时它可能看起来很简单,可以使用 或任何其他正则表达式解析器执行,但没有...

另一方面,如果你真的想使用,你可以做什么——首先使用 处理文件并将其转换为PYX 格式。

PYX 格式是面向行的表示 从 SGML ESIS 格式派生的 XML 文档。 (参见 ESIS - ISO 8879 元素结构信息集规范, ISO/IEC JTC1/SC18/WG8 N931 (ESIS))

所以你真正想做的是:

$ xmlstarlet pyx <file.html> | do_your_magic_here | xmlstarlet depyx > file.new.html

在你的情况下,这将是这样的:

$ xmlstarlet pyx file.html \
  | awk 'c~/^- *\\n *$/&&/^)script$/{c=$0;next}{print c; c=$0}END{print c}' \
  | xmlstarlet depyx

这将输出

<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta>
        <title>JavaScript Ders 2</title>
        <script language="javascript" src="script1.js" type="text/javascript"></script>
        <script language="javascript" src="script2.js" type="text/javascript"></script>
        <script>
            // script kodumuz buraya yazılacak
        </script>
    </head>
    <body>
        <script language="javascript" src="script3.js" type="text/javascript"></script>
    </body>
</html>

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed 'N;s/\n\(<\/script>\)/\1/;P;D' file
    

    在整个文件中保留两行的窗口,如果第二行以&lt;/script&gt; 开头,则删除前面的换行符。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多