用grep删除css注释

时间:2018-01-19 15:15:56

标签: bash shell awk sed

我正在编写一个脚本,删除normalize.css中的评论,如下所示:

  
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */

/* Document
   ========================================================================== */

/**
 * 1. Correct the line height in all browsers.
 * 2. Prevent adjustments of font size after orientation changes in
 *    IE on Windows Phone and in iOS.
 */

html {
  line-height: 1.15; /* 1 */
  -ms-text-size-adjust: 100%; /* 2 */
  -webkit-text-size-adjust: 100%; /* 2 */
}

/* Sections
   ========================================================================== */

/**
 * Remove the margin in all browsers (opinionated).
 */

我试过了   

#!/usr/bin/env sh

normalize="node_modules/normalize.css/normalize.css"
if [[ -f "$normalize" ]]; then
  grep -v "\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*\\/+" $normalize > index.css
else
  echo "There is no normalize.css available."
fi

我已经通过normalize.css

加载了package.json   
{
  "devDependencies": {
    "normalize.css": "latest"
  }
}

您可以将上述package.json保存在文件夹中并运行npm i来对此进行测试。如果你有节点和npm,你应该有node_modules文件夹,并在其中标准化。

regex101使用上面的正则表达式查找注释,但grep只输出带注释的同一文件。

我做错了什么?

编辑:预期输出:

  
html {
  line-height: 1.15;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
}

1 个答案:

答案 0 :(得分:1)

您可以使用此awk命令删除所有以/*开头并以*/结尾的css评论:

cat remComm.awk

function remComm() {
   if ( !m )
      m = index($0, cs);

   if ( m && p = index($0, ce) ) {
      $0 = substr($0, 1, m-1) substr($0, p+2);
      if (m = index($0, cs))
         remComm();
   }
}
BEGIN {
   cs="/*";
   ce="*/";
   m = 0;
}
{
   remComm();
   if ( !m && NF )
      print;
}

将其用作:

awk -f remComm.awk normalize.css

<强>输出:

html {
  line-height: 1.15;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
}
  • 这是非正则表达式解决方案,因此应该更快地处理大文件。
  • 这也会处理嵌套注释以及每行多个注释块的存在。
  • 我们在遇到/*时设置评论的起始位置,并在文件中获取*/时获得结束位置。
  • 使用substring功能,我们会删除评论的位置,并在$0
  • 中留下休息 递归调用
  • 函数remComm以删除每行多个注释。
  • 使用!NF我们跳过打印空白或空白行。