如何使用AWK通过空格缩进来识别节



数据文件如下:

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";}

但:

  1. 你不需要在括号表达式([ ])里面放一个空白,因为它已经是文字
  2. 你不需要写$0 ~ /foo/,因为/foo/的意思是一样的
  3. 您不需要测试[a-z]+,因为这是在任何前导空白之后的所有内容

所以你只需要:

$ awk 'NF{print (/^ / ? "item" : "section title")}' file
section title
item
item
section title
item
item

相关内容

  • 没有找到相关文章

最新更新