正则表达式删除块注释也删除*选择器

时间:2015-05-13 10:08:12

标签: regex linux bash unix sed

我正在尝试使用bash从.css文件中删除所有块注释。我有一个sed命令的以下正则表达式:

sed -r '/\/(\*)*(\s)?(\w)*|(\*)(\s)?(\w)*/d'

这可以很好地剥离块注释,例如:

/**
* This is a comment
*/

/* this is another comment */

但它也删除了* Selector的实例

* { 
     font-size: 10px;
     ...etc
  }

如何更改当前正则表达式以考虑此特殊情况?或者我需要重写我的正则表达式吗?

编辑: 澄清一下,我将遇到的评论种类:

/**
* This is a comment
*/

/* This is another comment */

/* This is also 
valid
*/

/** "*/" as is { this } */

3 个答案:

答案 0 :(得分:3)

使用awk

awk '!/\/?\*/||/{/'  file

解释

!/\/?\*/ 

!意味着没有 //包含正则表达式 \/? 0或1个fwd斜杠,需要转义,因为/正在使用正则表达式 \*文字*

整体匹配不以/*

开头的行
||

或者用于链接语句的命令,如果第一个命令失败,它将短路而不执行第二个(虽然这里不相关)

/{/

如果该行包含一个开括号,则执行命令块

没有命令块,默认操作是打印。

总的来说,命令'!/^\/?\*/||/{/'表示该行不包含/**或者包含{,然后打印该行。< / p>

Incase评论包含{

awk '/\/\*/{x=1}!x;/\*\//{x=0}' file

解释

此行检查行/*并将x设置为1。 !x表示如果x为0或null,则打印该行。它打印,因为它没有动作块。 <{1}}在遇到x时被设置回0。

输出

*/

不考虑* { font-size: 10px; ...etc }

等引用的内容

何时会破坏

/* "*/" hello i'm still comment

COMMAND

awk '!/\/?\*/||/{/'

FILE

...

/* I am comment that will print */

COMMAND

awk '/\/\*/{x=1}!x;/\*\//{x=0}'

FILE

答案 1 :(得分:2)

以下sed命令适合您:

sed '/\/\*\**/{:a;/\*\//d;N;ba}' file.css

该命令搜索模式/**/*,如果找到,则执行大括号{cmd1;cmd2;...}之间的命令块。在该块中,我首先定义标签:a。在下一个命令中,我检查模式缓冲区是否包含结束*/。如果找到,我删除模式缓冲区并开始下一个循环。否则,我会通过N将下一行输入附加到patttern缓冲区,然后转到标记aba

file.css:

/**
* This is a comment
*/
a {
    font-size: 10px;
}

/* This is another comment */
li {
    font-size: 12px;
}

/* This is also 
valid
*/
* {
    color:white;
}

/** "*/" as is { this } */
table {
    color:blue;
}

输出:

a {
    font-size: 10px;
}

li {
    font-size: 12px;
}

* {
    color:white;
}

table {
    color:blue;
}

答案 2 :(得分:0)

以下代码适用于您提供的所有方案

sed ':1;/^ *\/\*/{:2;/\*\/$/{d;b 1;};N;b 2;}' filename