我正在使用awk,我需要跳过空白或评论的行。我一直在循环中尝试查看它是否与正则表达式匹配,然后使用下一个
{if ($0 ~"/^($|#)/" ) {next;}}
但if语句永远不会被击中,我无法弄清楚原因。 (我的输入有空行和注释)
我需要在块中的awkscript中添加此行,而不是命令行参数。
答案 0 :(得分:1)
假设您在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
答案 1 :(得分:1)
在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
答案 2 :(得分:0)
您可以使用以下方法:
awk '! /^($|#)/' infile
对于不以#
开头或空白的每一行,它使用默认的print操作。
答案 3 :(得分:0)
awk '/^$|#/{next} {print $0}'
会完成这项工作
或
更简单
awk '/^[^$#]/ '
它的作用是什么?
/^[^$#]/
匹配正则表达式的每一行,如果找到匹配项,则完成打印整个记录的默认操作。
^
将正则表达式固定在线的开头。
[^$#]
否定了字符类。
$
=>线是空的,否定跳过线
#
=>评论
例如
$ cat input
hello
#world
this is a
test
$ awk '/^[^$#]/ ' input
hello
this is a
test