Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么不是';这个sed命令对正则表达式不起作用吗?_Regex_Linux_Sed - Fatal编程技术网

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
    删除空行
  • bx
    无条件跳转到:x
在文档中找到更多信息


它将不起作用,因为默认情况下,
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