删除所有Bash评论

时间:2014-10-26 17:55:31

标签: regex bash sed

如何匹配和删除该行的所有评论?我可以从新行开始删除注释,或者使用sed删除不在引号中的注释。但我的脚本在以下示例中失败

This one "# this is not a comment" # but this "is a comment"

可以处理这种情况吗?如果是什么是正则表达式?

示例:

  • 输入:

    This one "# this is not a comment" # but this "is a comment" 
    
  • 输出:

    This one "# this is not a comment"
    

2 个答案:

答案 0 :(得分:1)

您可以使用直接应用于脚本的Flex等词法分析器。在其手册中,您可以找到" How can I match C-style comments?"而且我认为你可以根据你的问题调整那部分。

如果您需要深入的教程,可以找到它here;根据"词汇分析"您可以找到一个pdf,向您介绍该工具和一个包含一些实际示例的存档,包括" c99-comment-eater",您可以从中获取灵感。

答案 1 :(得分:1)

如果我们假设 在引号中或使用反斜杠进行转义时不是注释,那么我们可以定义以下正则表达式:

(ES|RT|QT)*C?

其中

ES - 转义序列:\后跟1个字符

\\.

RT - 非特殊常规文字

[^"\\#]*

QT - 引号中的文字

"[^"]*"

C - 以未转义的,未加引号的哈希符号#开头并以行尾结尾的注释

#.*

使用 sed 的可能解决方案:

sed 's/^\(\(\\.\|[^"\\#]*\|"[^"]*"\)*\)#.*$/\1/'