awk以某种格式捕捉线条

时间:2016-01-10 17:11:47

标签: bash awk gawk

我有一个完整的行文件,我想使用awk来捕获具有某种格式的行。

输入

text that I dont want
control similar text but not quite
control "1text, numbers 2 and special characters inside quotes %&¤" sometext sometext #-- The desired line
more text I dont want
stuff

输出

control "text inside quotes" sometext sometext
#-- There isn't comments like these in the file, so no need to process them

然后该行将存储在一个行号为MENU[POS'$POS']=$0","NR

的数组中

这是我已经尝试过的事情:

awk '$0 ~ /^control "[:alpha:]" [:alpha:] [:alpha:]$/ {print}'
awk '$0 ~ /^control "*" * *$/ {print}'

2 个答案:

答案 0 :(得分:2)

首先,不能单独使用命名的字符类。它需要括在括号之间。否则它将被解释为字符类[:alph],意思是文字字符:alph

变化:

[:alpha:]

为:

[[:alpha:]]

其次看起来你错过了+字符类之后的[[:alpha:]]量词。 +表示一个或多个。此外,您还应该在引号之间匹配空格。 (因为它们出现在测试数据中)。

应该是:

awk '/^control "[[:alpha:][:space:]]+" [[:alpha:]]+ [[:alpha:]]+$/'

可以缩短为:

awk '/^control "[[:alpha:][:space:]]+"( [[:alpha:]]+){2}$/'

顺便说一句,如您所见,您无需在$0 ~ /REGEX/{print}中撰写awk。您只需编写/REGEX/即可。这是因为默认情况下,整个记录($0)将成为awk中模式匹配的主题。另外printawk中的默认操作,这意味着如果条件评估为true且未指定任何操作,则awk将打印整个记录。

答案 1 :(得分:0)

基于Jonathan Leffler的评论:

awk '$0 ~ /^control "[^"]+"[^"]*$/ { print }'

<强>输出

  

控制“引号内的文字”sometext sometext

这会查找带有控制和双引号的行,拒绝具有1,3或更多引号的行。