如何在awk脚本中忽略#

How to ignore # in awk script

我有一个 awk 脚本可以将配置文件转换为 csv。我试图忽略以 # 开头的行。我必须使用 \#?

这是我的脚本

#!/bin/awk -f

# the line doesn't container "#" or "]" or "[" go here
[=10=] ~ /(#|\[|\])/ {
    #                                        
    # 017 : Maximum_Plug_Speed                    = 75
    
    # config_name, option_number, option_value, NULL, NULL, NULL
    printf "%s\b\b\b\b,%s,%s,,,", FILENAME, , 
}

# the line doesn't contain # and contains "[" or "]" got here
[=10=] ~ /[^#]/ && /([|])/ {
    #                                                         
    # 019 * Overspeed_Limit_Set_Point             = 73              R [50 73] MPH

    # config_name, option_number, option_value, option_range_def, option_range_low, option_range_high  
    printf "%s\b\b\b\b,%s,%s,%s%s%s%s,$s,$s", FILENAME, , , ,  , , , substr(,1), 
}

这样对吗?

您可以轻松地跳过以 '#' 开头的行或将其第一个 non-whitespace 字符作为 '#',方法是编写一个跳转到 next 行的规则。您可以将以下内容作为您的第一条规则:

/^ *#/ {next}

这将满足您的需求。

正则表达式的解释

  • /^ *#/ - 在 ^ 行开头匹配零个或多个空白字符 * (space*) 后跟 '#'

例子Use/Output

$ awk '/^ *#/ {next}1' << eof
> # my dog
> has fleas
>    # my cat
> has none
> eof
has fleas
has none

(上例中的1只是默认print操作的shorthand)


跳过其他字符

如果您真的想跳过所有包含 '#''['']' 的行(如脚本中的第一个注释所示),那么您可以添加 (ex1|exp2|exp3) 其中表达式 exp1..3 是可选匹配的正则表达式。您需要转义 \[\],因为 '['']' 作为字符 class 的一部分具有特殊含义,例如

/(^ *#|\[|\])/ {next}

这将跳过以 '#' 作为第一个 non-whitespace 字符或 '['']' 行中任意位置的行。

例子

$ awk '/(^ *#|\[|\])/ {next}1' << eof
> # my dog
> has [fleas
>    # my cat
> ]has none
> lucky cat!
> eof
lucky cat!

如果您想检查行是否包含特定字符并且不想关心转义,您可以利用 index 函数,它是 String Functions 之一。如果在其他地方找到 0,它会执行所述字符的 return 位置,因此,如果您将其用作条件,那么如果在任何地方都找到字符,它就会得到满足。

例如 printing 所有包含 [ 的行可以通过

完成
awk 'index([=10=],"["){print}' file.txt