Regex 为什么不是';这个sed命令对正则表达式不起作用吗?
我想使用Regex 为什么不是';这个sed命令对正则表达式不起作用吗?,regex,linux,sed,Regex,Linux,Sed,我想使用sed命令删除Java中的多行注释。如果我们使用字符范围,如a-zA-Z0-9等,则正则表达式有效,但对于单词字符,如\w\S,则正则表达式无效 测试文件内容: hello world /* abcd efgh*/ world hello 使用的命令: sed -i -e "s/\/\*[\s\S]\*\///" <file> 实际结果: hello world abcd efgh*/ world hello 您可以与正则表达式(-E)和反向匹配(-v)一起使用,即
sed
命令删除Java
中的多行注释。如果我们使用字符范围,如a-zA-Z0-9
等,则正则表达式有效,但对于单词字符,如\w\S
,则正则表达式无效
测试文件内容:
hello world
/* abcd
efgh*/
world hello
使用的命令:
sed -i -e "s/\/\*[\s\S]\*\///" <file>
实际结果:
hello world
abcd
efgh*/
world hello
您可以与正则表达式(-E
)和反向匹配(-v
)一起使用,即:
使用sed是可能的,但不是那么容易
sed ':x ; /^\/\*/ { N ; s/.*\*\/// ; /^$/d ; bx }' file
是一个标签:x
是/*/^\/\*/
将输入中的行追加到模式空间N
替换任何{…}*/s/*\*\/
删除空行/^$/d
无条件跳转到:xbx
sed
在单独的行上搜索和替换,并且[\s\s]
与POSIX正则表达式中的任何字符都不匹配,它匹配\
、s
或s
(此外,您甚至没有尝试对其进行量化,因此即使在在线正则表达式测试仪中也不起作用)。为什么不尝试删除以/*
开头的每一行,以及以*/
轻松模式结尾的每一行:perl-i-0777-pe的!/\*.*?\*/!!sg'
。这就是说,这种方法不起作用,因为它没有考虑//注释或字符串文本。效果很好,谢谢@melpomene。我想我也应该看一下性能比较。它会错过放在一行语句@ HamzaAbdaoui中间的多行注释。
grep -Ev '(\/\*|\*\/)' < text.txt
hello world
world hello
sed ':x ; /^\/\*/ { N ; s/.*\*\/// ; /^$/d ; bx }' file