如何在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 位置,因此,如果您将其用作条件,那么如果在任何地方都找到字符,它就会得到满足。
例如 print
ing 所有包含 [
的行可以通过
完成
awk 'index([=10=],"["){print}' file.txt
我有一个 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 位置,因此,如果您将其用作条件,那么如果在任何地方都找到字符,它就会得到满足。
例如 print
ing 所有包含 [
的行可以通过
awk 'index([=10=],"["){print}' file.txt