【发布时间】:2014-10-26 08:42:51
【问题描述】:
我正在使用 awk,我需要跳过空白行或 cmets。我一直在循环内部尝试查看它是否与正则表达式匹配,然后使用下一个
{if ($0 ~"/^($|#)/" ) {next;}}
但是 if 语句永远不会被击中,我不知道为什么。 (我的输入有空行和cmets)
我需要将此行添加到块中的 awkscript 内,而不是命令行参数。
【问题讨论】:
我正在使用 awk,我需要跳过空白行或 cmets。我一直在循环内部尝试查看它是否与正则表达式匹配,然后使用下一个
{if ($0 ~"/^($|#)/" ) {next;}}
但是 if 语句永远不会被击中,我不知道为什么。 (我的输入有空行和cmets)
我需要将此行添加到块中的 awkscript 内,而不是命令行参数。
【问题讨论】:
假设您位于 awk 代码块中,该代码块不会从匹配模式的默认打印中受益,并且您需要使用 if 测试,这是解决方案的基础
$ echo "a
b
c
d
#
#e
f
" | awk '{if ($0 ~ /^(#|$)/ ) {next;} ;print}'
产生输出
a
b
c
d
f
如果您想跳过包含空格/制表符的空白行,您可以添加
awk '{if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}'
#-------------------^^^^^^
# means char-class of space and tab char
# * means zero or more of preceding
IHTH
【讨论】:
在awk 中,正则表达式由开头和结尾的斜杠标记。如果你把它放在引号内,它就不再是一个正则表达式,而是一个字符串。因此,替换:
{if ($0 ~"/^($|#)/" ) {next;}}
与:
{if ($0 ~ /^($|#)/ ) {next;}}
考虑输入文件:
$ cat input
one
#comment
two
three
four
现在观察awk 脚本:
$ awk '{if ($0 ~ /^($|#)/ ) {next;}} 1' input
one
two
three
four
【讨论】:
您可以使用以下一种:
awk '! /^($|#)/' infile
它对不以# 开头或为空白的每一行使用默认的打印操作。
【讨论】:
awk '/^$|#/{next} {print $0}'
会做的工作
或
更简单
awk '/^[^$#]/ '
它有什么作用?
/^[^$#]/ 将每一行与正则表达式匹配,如果找到匹配项,则会执行打印整条记录的默认操作。
^ 将正则表达式锚定在行首。
[^$#] 否定字符类。确保行首不跟
$ => 行为空,否定跳过该行
# => 评论
例如
$ cat input
hello
#world
this is a
test
$ awk '/^[^$#]/ ' input
hello
this is a
test
【讨论】:
awk '{if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}'? (注意开头的单引号字符的位置)。祝你好运。