Unix/Linux,删除行中的注释

Unix/Linux,删除行中的注释,linux,bash,unix,sed,comments,Linux,Bash,Unix,Sed,Comments,我需要删除/删除用户输入行中的注释,而不删除任何代码。例如: mail -s 'text' brown < text #comments 但它不起作用。知道我做错了什么吗 此外,如何检测不使用#开始评论的情况? 例如,引用的#和以#结尾的代码行,因为它们不是注释 echo $line | sed -e '/^#/d' 在这一行中,#不是用作注释,而是作为代码的一部分。我发现我需要检测#是否在引号内或在#之前没有空格字符。如何使输出保持原样?您可以使用此awk awk '{sub(/#

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

mail -s 'text' brown < text #comments
但它不起作用。知道我做错了什么吗

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

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

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

您可以使用此
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
#/bin/bash
pidof tail#查看tail是否在运行
如果[$?-ne 0];然后#开始循环
awk'{print“#“$8}”file>tmp#这是我的代码
fi#循环结束

AWK-F*'{ for(i=1;i),考虑BASH中的注释后几乎总是出现什么。

#comment...
#another comment
换行符!实际上是一个字符。因此,您所要做的就是在#之后添加一个通配符,以包含实际的注释文本,然后在末尾添加一个换行符“character”。您实际上需要使用\n而不是尝试按Enter键。不幸的是,我目前不在linux上,有时使用分隔符(反斜杠)无法正常工作。尝试类似“\n”的操作可能会起作用,或者使用“$”\n”

EDIT:With regex^表示新行的开始,而$表示结束

至于不删除实际代码,匹配紧跟在#之后的空格应该有效。我会匹配在#之前的空格或换行符


无论如何,请确保不要意外地破坏您正在进行的工作,以防我弄错。

是的,但问题是它也会删除任何不属于注释的内容。例如:code/#/code。由于#是代码的一部分,我不希望它删除该行中的任何内容。@chipupui您能告诉我程序是如何运行的吗你可以看到作为注释而不是代码的一部分使用的
#
的区别。然后你需要一些逻辑来理解文本是关于代码的人工信息。请注意,这会破坏
$#
${variable}的任何使用
或使用
#
的各种其他构造,更不用说包含
#
@JonathanLeffler的引用字符串了,这是我的观点之一。没有办法自动删除注释。有些人必须查看它是否注释或部分代码。这是可以做到的,但它需要一个完整的shell语言解析器e(或者,至少是一个词汇扫描器,能够识别shell语言的所有语法规则)。使用
sed
无法合理地完成此操作;使用
awk
将非常混乱。事实上,无论使用何种语言来实现解析器/扫描仪,都会非常混乱。我想知道您认为如何自动从我的帖子中的示例文件中删除注释。正确地完成此工作是不可能的除非你考虑到shell脚本的词法结构。你需要处理单引号字符串、双引号字符串、变量扩展,比如
$$\(请记住,带引号的字符串可以扩展到多行!),然后您可以开始检测注释。请注意,
echo a#b
会回显三个字符加一个换行符。不,这正是我要问的。我只是不知道该怎么做,因为我还在学习sed/awk。我最初想逐个字符解析字符串,并检查#前面的字符是空格还是换行符,但事实并非如此很多工作。
#comment...
#another comment