数据文件如下:
foo:
item1: 1
item2=2
bar:
item1 = 100
item2 : 200
空格缩进用于指定部分,例如"foo"one_answers";bar"是section开始,因为它们在行的开始。但是AWK默认删除空白,这让我想知道如何编写匹配的模式。
我试过了:
$0 ~ ^[a-z]+: {print "section title";}
$0 ~ ^[ ]+[a-z]+ {print "item";}
但是我有语法错误:
awk: /tmp/2.awk:1: $0 ~ ^[a-z]+: {print "section title";}
awk: /tmp/2.awk:1: ^ syntax error
awk: /tmp/2.awk:1: $0 ~ ^[a-z]+: {print "section title";}
awk: /tmp/2.awk:1: ^ syntax error
awk: /tmp/2.awk:2: $0 ~ ^[ ]+[a-z]+ {print "item";}
awk: /tmp/2.awk:2: ^ syntax error
awk: /tmp/2.awk:2: $0 ~ ^[ ]+[a-z]+ {print "item";}
awk: /tmp/2.awk:2: ^ syntax error
请帮助。
(谢谢RavinderSingh13,现在它工作了:
>cat /tmp/2.awk
$0 ~ /^[a-z]+:/ {print "section title";}
$0 ~ /^[ ]+[a-z]+/ {print "item";}
>awk -f /tmp/2.awk /tmp/data
section title
item
item
section title
item
item
关于AWK by default removes whitespace
-不,它没有。不知道你在想什么
在你的代码中,你只是忘了把regexp分隔符/.../
放在你的regexp周围,所以你可以把它写成:
$0 ~ /^[a-z]+:/ {print "section title";}
$0 ~ /^[ ]+[a-z]+/ {print "item";}
但:
- 你不需要在括号表达式(
[ ]
)里面放一个空白,因为它已经是文字 - 你不需要写
$0 ~ /foo/
,因为/foo/
的意思是一样的 - 您不需要测试
[a-z]+
,因为这是在任何前导空白之后的所有内容
所以你只需要:
$ awk 'NF{print (/^ / ? "item" : "section title")}' file
section title
item
item
section title
item
item