Bash脚本:删除其他Bash脚本中的所有注释

Bash脚本:删除其他Bash脚本中的所有注释,bash,unix,sed,Bash,Unix,Sed,因此,基本上,标题说明了我需要做的事情:删除其他bash脚本中的所有注释,除了/当然了。注释可以位于行的开头,也可以位于代码行之后的行的末尾 我已经浏览了以下线程: , 但没有一个真正起到帮助作用,目前,我坚持这样做: sed-e'2,$s/^/d'myscript.sh 这应该会删除行开头的注释,但不会。 你知道什么地方可能出错以及如何解决整个任务吗?删除s,不涉及替换。要运行的命令是d:delete。另外,/^/是地址,但2$也是地址,不能合并地址。因此,使用{}创建一个内部作用域,您可以

因此,基本上,标题说明了我需要做的事情:删除其他bash脚本中的所有注释,除了/当然了。注释可以位于行的开头,也可以位于代码行之后的行的末尾

我已经浏览了以下线程: ,

但没有一个真正起到帮助作用,目前,我坚持这样做:

sed-e'2,$s/^/d'myscript.sh

这应该会删除行开头的注释,但不会。 你知道什么地方可能出错以及如何解决整个任务吗?

删除s,不涉及替换。要运行的命令是d:delete。另外,/^/是地址,但2$也是地址,不能合并地址。因此,使用{}创建一个内部作用域,您可以在其中使用另一个地址:

sed '2,${/^#/d}'
请注意,行尾的注释将被保留:

x=42  # The answer to ...

为了删除它们,您需要解析这些命令。这可不是小事。也许可以使用语法突出显示正确的现有解决方案,并使用其逻辑来识别注释?

就整个解决方案而言,举个例子:

 #!/bin/bash
 fsdfsdf
 sdfsfds
 #sdfdsfsdf
 sdfsdf
 #sdfsdfdf
 #sdfsdf
 #sdfdsf
 sfdsdfsfsdf #fgdgfgdgdfg
 dasdasd
 asdsad
 asdsadsd  #dsadsadsad
 #dasdsadsa

 sed -e '2,${/^#/d}' file | sed -r '/^.*#/{s/([^#])(#.*$)/\1/}'

第一个sed语句将处理从2到文件末尾的行,并删除以开头的任何行。然后,该输出通过管道传输到另一个sed语句,该语句搜索包含a的任何行,然后将该行拆分为两个部分,将该行替换为第一部分,仅替换代码而不是注释

删除s,您不是在替换,而是在删除。/^/part是地址,而不是s//.sed-e'2,${/^/d}'myscript.shGood advice的一部分。有一个很好的替代方案,它只使用env和bash本身。是的,非常感谢,它使代码的一半工作正常。出于某种原因,我认为d选项是一个标志,因此必须位于sed构造的末尾。这会中断数组长度${array[@]}或参数替换${array*}。