使用sed删除文件中的所有注释

Log*_*ick 7 bash sed

如何使用sed从文件(用#定义)中删除所有注释,而不是'#'在字符串中?

除了字符串部分之外,有很多帮助.

bea*_*mit 10

如果#总是意味着评论,并且可以出现在任何地方(如某些代码之后):

sed 's:#.*$::g' <file-name>
Run Code Online (Sandbox Code Playgroud)

如果要在适当的位置更改它,请添加-i开关:

sed -i 's:#.*$::g' <file-name>
Run Code Online (Sandbox Code Playgroud)

这将删除任何行#到行的末尾,忽略任何上下文.如果您#在任何不是注释的地方使用(比如在字符串中),它也会删除它.

如果注释只能从一行的开头开始,请执行以下操作:

sed 's:^#.*$::g' <file-name>
Run Code Online (Sandbox Code Playgroud)

如果它们之前可能有空格,但没有别的,请执行:

sed 's:^\s*#.*$::g' <file-name>
Run Code Online (Sandbox Code Playgroud)

这两个会更安全一些,因为它们可能不会删除#代码中的有效用法,例如字符串.

编辑:

没有一种很好的方法来检测某些东西是否在字符串中.如果能满足你语言的限制,我会使用最后两个.

检测您是否在字符串中的问题是正则表达式无法完成所有操作.有一些问题:

  • 字符串可能跨越线条
  • 正则表达式无法区分叛逆者与单引号之间的区别
  • 正则表达式不能匹配嵌套引号(这些情况会混淆正则表达式):

    # "hello there"
    # hello there"
    "# hello there"
    
    Run Code Online (Sandbox Code Playgroud)

如果双引号是定义字符串的唯一方法,双引号将永远不会出现在注释中,并且字符串不能跨越多行,请尝试以下方法:

sed 's:#[^"]*$::g' <file-name>
Run Code Online (Sandbox Code Playgroud)

这是很多先决条件,但如果他们都坚持下去,那么你就是在做生意.否则,我担心你是SOL,而且你最好用Python之类的东西编写它,在那里你可以做更高级的逻辑.


pot*_*ong 5

这可能适合你(GNU sed):

sed '/#/!b;s/^/\n/;ta;:a;s/\n$//;t;s/\n\(\("[^"]*"\)\|\('\''[^'\'']*'\''\)\)/\1\n/;ta;s/\n\([^#]\)/\1\n/;ta;s/\n.*//' file
Run Code Online (Sandbox Code Playgroud)
  • /#/!b如果该行不包含#保释金
  • s/^/\n/插入一个独特的标记(\n)
  • ta;:a 跳转到循环标签(重置替换的true/false标志)
  • s/\n$//;t 如果标记在该行的末尾,删除并拯救
  • s/\n\(\("[^"]*"\)\|\('\''[^'\'']*'\''\)\)/\1\n/;ta 如果标记后面的字符串是引号,则将标记向前撞击并循环.
  • s/\n\([^#]\)/\1\n/;ta如果标记后面的字符不是a #,则将标记向前撞击并循环.
  • s/\n.*// 该行的其余部分是注释,删除标记和行的其余部分.