我正在尝试使用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 } */
答案 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缓冲区,然后转到标记a
到ba
。
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