为什么此sed命令不能用于正则表达式?

时间:2019-01-09 11:01:29

标签: regex linux sed

我想使用sed命令删除a-zA-Z0-9中的多行注释。如果我们使用诸如\w\S之类的字符范围,则正则表达式是有效的,但是对于诸如hello world /* abcd efgh*/ world hello 之类的文字字符,则不能使用正则表达式。

测试文件内容:

sed -i -e  "s/\/\*[\s\S]\*\///" <file>

使用的命令:

hello world
world hello

预期结果:

hello world
 abcd
efgh*/
world hello

实际结果:

{{1}}

2 个答案:

答案 0 :(得分:1)

您可以将grep与正则表达式(-E)和反向匹配(-v)配合使用,即:

grep -Ev '(\/\*|\*\/)' < text.txt

输出:

hello world
world hello

答案 1 :(得分:1)

使用sed可以实现,但并不容易。

sed ':x ; /^\/\*/ { N ; s/.*\*\/// ; /^$/d ; bx }' file
  • :x是标签
  • /^\/\*/是/ *
  • N将输入的行追加到模式空间
  • s/.*\*\///替换任何{...} * /
  • /^$/d删除空行
  • bx无条件跳转到:x

在文档中找到更多信息