awk 捕捉特定格式的行

Awk catching lines with certain format

我有一个充满行的文件,我想使用 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']=[=13=]","NR

这是我已经尝试过的方法:

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

首先,命名字符class不能单独使用。它需要被括在括号之间。否则它将被解释为字符 class [:alph] 表示文字字符 :alph.

变化:

[:alpha:]

至:

[[:alpha:]]

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

应该是:

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

可以缩短为:

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

顺便说一句,如您所见,您不需要在 awk 中编写 [=23=] ~ /REGEX/{print}。您可以简单地写 /REGEX/ 代替。这是因为默认情况下整个记录 ([=26=]) 将在 awk 中进行模式匹配。此外,printawk 中的默认操作,这意味着如果条件计算结果为 true 且未指定操作,则 awk 将打印整个记录。

基于 Jonathan Leffler 的评论:

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

输出

control "text inside quotes" sometext sometext

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