如何从bash脚本中删除注释

时间:2014-08-13 16:17:28

标签: bash

我正在尝试创建一个脚本,将脚本文件作为参数。它应该从文件中删除注释并将其传递给另一个脚本。 (如果可能,没有临时文件)

一开始我认为这样做

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

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用内嵌 sed以及更好的正则表达式:

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

答案 1 :(得分:2)

这是从脚本文件中剥离注释的一种非常特定于bash的方法。如果有一条线(毕竟它是一条评论),它也会删除she-bang线,并进行一些重新格式化:

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

这会将脚本转换为函数,并使用bash内置declare来打印生成的函数(tail删除函数名称,但不删除周围的函数如果认为有必要的话,更复杂的后期处理也可以删除它们。

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

<强>更新

可悲的是,发布shellshock以上内容不再适用。但是,对于修补的bashes,以下可能会:

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

另请注意,此方法不会删除命令或进程替换内部的注释。

答案 2 :(得分:0)

是的,通常这种类型的问题可以在没有临时文件的情况下解决。

然而,这还取决于确定评论分隔符字符实际上何时引入评论所需的解析的复杂性。