Unix / Linux,从行中删除注释

时间:2014-05-12 04:51:13

标签: linux bash unix sed comments

我需要删除/删除用户输入行中的注释而不删除任何代码。例如:

mail -s 'text' brown < text #comments

如何删除评论并保持代码完整? 我可以删除以#开头的行,但如果它从行的中间某处开始则不行。

我试过了:

echo $line | sed -e 's/\

但它不起作用。知道我做错了吗?

另外,如何检测#不用于开始评论的案例? 例如,引用#和以#结尾的代码行,因为它们不是注释。

echo $line | sed -e  '/^#/d'

在这一行中,#不用作注释,而是用作代码的一部分。我发现如果#在引号之内或者在#之前没有空白字符,我需要检测到。如何保持输出不变?

2 个答案:

答案 0 :(得分:2)

您可以使用此#

将所有内容从awk删除到行尾
awk '{sub(/#.*$/,"")}1' file

但如果您有这样的文件:

#!/bin/bash
pidof tail #See if tail is running
if [ $? -ne 0 ] ; then  #start loop
   awk '{print " # "$8}' file >tmp # this is my code
fi # end of loop
awk -F# '{for (i=1;i<=NF;i++) print $i}' file > tmp2
a=a+1 # increment a

如果不破坏某些评论,就无法自动删除评论。

答案 1 :(得分:0)

好吧,考虑一下在bash发表评论后几乎总会发生的事情。

#comment...
#another comment

换行!这实际上是一个角色。所以,你要做的就是在你的#之后添加一个通配符,以包含实际的评论文本,然后添加一个换行符&#39;字符&#39;在末尾。 你实际上需要使用\ n而不是尝试按Enter键。不幸的是我现在不在linux上,有时分隔符(反斜杠)不会好好工作。 尝试像`\ n`这样的东西可能有用,或者可能使用$&#39; \ n&#39;。

编辑:使用正则表达式^将指示新行的开始,而$表示结束。

至于不删除实际代码,匹配紧跟#后面的空格应该有效。我会匹配#。

之前的空格或换行符

无论如何,请确保不要意外毁掉你正在处理的任何事情,以防万一我错了。