如果#总是表示评论,并且可以出现在一行的任何地方(如某些代码之后):
原文链接:https://www.f2er.com/bash/387011.htmlsed 's:#.*$::g' <file-name>
如果要在适当的位置更改它,请添加-i开关:
sed -i 's:#.*$::g' <file-name>
这将从任何#删除到行尾,忽略任何上下文.如果你在任何不是注释的地方使用#(比如在字符串中),它也会删除它.
如果评论只能从一行的开头开始,请执行以下操作:
sed 's:^#.*$::g' <file-name>
如果它们之前可能有空格,但没有别的,可以:
sed 's:^\s*#.*$::g' <file-name>
这两个会更安全一些,因为它们可能不会删除代码中#的有效用法,例如字符串.
编辑:
没有一种很好的方法来检测某些东西是否在字符串中.如果能满足你语言的限制,我会使用最后两个.
检测您是否在字符串中的问题是正则表达式无法执行所有操作.有一些问题:
>字符串可能跨越线条
>正则表达式无法区分叛逆者与单引号之间的区别
>正则表达式不能匹配嵌套引号(这些情况会混淆正则表达式):
# "hello there" # hello there" "# hello there"
如果双引号是定义字符串的唯一方法,双引号将永远不会出现在注释中,并且字符串不能跨越多行,请尝试以下方法:
sed 's:#[^"]*$::g' <file-name>
这是很多先决条件,但如果他们都坚持下去,你就是在做生意.否则,我担心你是SOL,你最好用Python之类的东西来编写它,在那里你可以做更高级的逻辑.