2014-05-12 99 views
0

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

mail -s 'text' brown < text #comments 

如何删除注释并保持代码不变? 我可以删除以#开头的行,但如果它从行中间的某个位置开始,则不能删除。

我想:

echo $line | sed -e 's/\ 

,但它不工作。任何想法我做错了什么?

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

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

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

+0

我想知道您是如何认为您可以自动从我的帖子中的示例文件中删除评论的。 – Jotne

+0

除非您考虑到shell脚本的词法结构,否则不可能完成这项工作。你需要处理单引号字符串,双引号字符串,变量扩展例如'$#'和'$ {#variable}'和'$ {variable#head}',这里是文档(作为开始)。当你能够准确地检测到它们时,在他们所有的荣耀中(记住,引用的字符串可以延伸到多行!),然后你就可以开始检测评论。请注意'echo a#b'回显三个字符加一个换行符。 –

回答

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 

有没有办法可以自动删除评论无摧毁一些。

+0

是的,但问题是它也会删除不属于评论部分的内容。例如:代码/#/代码。由于#是代码的一部分,我不希望它从该行中删除任何内容。 – chipunpui

+0

@chipunpui你可以告诉我程序应该如何看待'#'作为注释的区别,而不是代码的某个部分。然后你需要一些逻辑来理解文本是关于代码的人类信息。 – Jotne

+0

请注意,这破坏了$#'或$ {#variable}'或其他各种使用'#'的构造,更不用说包含'#'的引用字符串了。 –

0

那么,考虑一下在bash中发表评论之后几乎总是会出现这种情况。

#comment... 
#another comment 

换行符!这实际上是一个角色。所以,你所要做的就是在你的#后加一个通配符,以包含实际的注释文本,然后在结尾处加上换行符“字符”。 您实际上需要使用\ n而不是尝试按Enter键。 不幸的是,我现在不在linux上,有时分隔符(反斜杠)无法正常工作。 尝试像\ n这样的东西可能会起作用,或者可能使用$'\ n'。

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

至于没有删除实际的代码,匹配紧跟#的空间应该工作。我会匹配#前面的空格或换行符。

无论如何,请不要意外破坏您正在处理的任何事情,以防万一我错了。

+0

不,这正是我所要求的。我只是不知道如何,因为我仍然在学习sed/awk。我最初认为要逐字符地解析字符串,并检查#之前的字符是空格还是换行符,但这是很多工作。 – chipunpui