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之类的东西编写它,在那里你可以做更高级的逻辑.
这可能适合你(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.*// 该行的其余部分是注释,删除标记和行的其余部分.