【问题标题】:how to remove comments from a bash script如何从 bash 脚本中删除注释
【发布时间】:2014-08-13 16:17:28
【问题描述】:

我正在尝试制作一个将脚本文件作为参数的脚本。它应该从文件中删除 cmets 并将其通过管道传输到另一个脚本。 (如果可能,没有临时文件)

一开始我也想这样做

cut -d"#" -f1 $1 | ./script_name

但它也会清除一部分不是 cmets 的行,因为有一些命令在其中使用 # (例如计算字符串字符)。

有没有办法在没有临时文件的情况下做到这一点?

【问题讨论】:

  • 如果没有 # 不是评论分隔符的示例,我们无法真正改进您已有的内容。
  • 引用的#呢,如echo " ## Welcome ##"
  • “notes”是指“cmets”吗?

标签: bash


【解决方案1】:

这是从脚本文件中删除 cmets 的一种非常特定于 bash 的方法。它还会去除 she-bang 行,如果有的话(毕竟,这是一个评论),并进行一些重新格式化:

tmp_="() {
$(<script_name)
}" bash -c 'declare -f tmp_' | tail -n+2

这会将脚本转换为函数,并使用 bash 内置 declare 漂亮地打印结果函数(tail 删除函数名称,但不删除周围的大括号;更复杂的帖子-process 也可以删除它们,如果认为有必要的话)。

漂亮的打印在子bash 进程中完成,既避免临时函数污染执行环境,又因为子进程将有效地将变量的字符串值识别为函数。

更新:

可悲的是,以上内容在炮击后不再有效。但是,对于已修补的 bash,可能会执行以下操作:

env "BASH_FUNC_tmp_%%=() {
$(<script_name)
}" bash -c 'declare -f tmp_' | tail -n+2

另外,请注意,此方法不会剥离命令或进程替换内部的 cmets。

【讨论】:

    【解决方案2】:

    您可以使用 inline sed 和更好的正则表达式:

    sed -i.bak '/^[[:blank:]]*#/d "$1"
    
    • ^[[:blank:]]*# 将匹配 # ,前提是每行前面都有可选空格
    • -i.bak 选项将内联编辑输入文件,以 .bak 作为备份文件的扩展名,以防出现问题。

    【讨论】:

      【解决方案3】:

      是的,一般来说这类问题不需要临时文件就可以解决。

      然而,这也取决于确定注释分隔符何时实际上不引入注释所需的解析复杂性。

      【讨论】:

        【解决方案4】:

        使用python3并安装pygments

        from pygments.lexers.shell import BashLexer
        from pygments.token import Token, is_token_subtype
        
        def delete_comments(fname):
            src = open(fname, "r").read()
            dst = open(fname, "w")
            for token in BashLexer().get_tokens(src):
                
                if not (is_token_subtype(token[0], Token.Comment)):
                    dst.write(token[1])
                
                if token[0] == Token.Comment.Hashbang:
                    dst.write(token[1])
        
        if __name__ == "__main__":
            delete_comments("/path/to/your/shellScript.sh")
        
        

        【讨论】:

        • 欢迎来到 Stackoverflow!请仔细阅读问题。作者试图从一个 shell 脚本中执行此操作:“我正在尝试制作一个脚本,该脚本将脚本文件作为参数。它应该从文件中删除 cmets 并将其通过管道传输到另一个脚本。”所以虽然这个 Python 脚本可能会移除 cmets,但并不能解决作者的问题。
        • 不管怎样,不管你喜不喜欢,这都是删除shell脚本注释的好方法
        • 我也有同样的需要删除 cmets 。所以我把我的方法分享给这位作者。
        猜你喜欢
        • 2019-07-04
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2016-03-11
        • 2010-10-24
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        相关资源
        最近更新 更多