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]
表示文字字符 :
、a
、l
、p
和 h
.
变化:
[:alpha:]
至:
[[:alpha:]]
其次,您似乎错过了 [[:alpha:]]
个字符 class 之后的 +
量词。 +
表示 一个或多个 。此外,您还应该匹配引号之间的空格。 (因为它们出现在测试数据中)。
应该是:
awk '/^control "[[:alpha:][:space:]]+" [[:alpha:]]+ [[:alpha:]]+$/'
可以缩短为:
awk '/^control "[[:alpha:][:space:]]+"( [[:alpha:]]+){2}$/'
顺便说一句,如您所见,您不需要在 awk
中编写 [=23=] ~ /REGEX/{print}
。您可以简单地写 /REGEX/
代替。这是因为默认情况下整个记录 ([=26=]
) 将在 awk
中进行模式匹配。此外,print
是 awk
中的默认操作,这意味着如果条件计算结果为 true
且未指定操作,则 awk
将打印整个记录。
基于 Jonathan Leffler 的评论:
awk '[=10=] ~ /^control "[^"]+"[^"]*$/ { print }'
输出
control "text inside quotes" sometext sometext
这会查找带有控制和双引号的行,拒绝带有 1 个、3 个或更多引号的行。
我有一个充满行的文件,我想使用 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]
表示文字字符 :
、a
、l
、p
和 h
.
变化:
[:alpha:]
至:
[[:alpha:]]
其次,您似乎错过了 [[:alpha:]]
个字符 class 之后的 +
量词。 +
表示 一个或多个 。此外,您还应该匹配引号之间的空格。 (因为它们出现在测试数据中)。
应该是:
awk '/^control "[[:alpha:][:space:]]+" [[:alpha:]]+ [[:alpha:]]+$/'
可以缩短为:
awk '/^control "[[:alpha:][:space:]]+"( [[:alpha:]]+){2}$/'
顺便说一句,如您所见,您不需要在 awk
中编写 [=23=] ~ /REGEX/{print}
。您可以简单地写 /REGEX/
代替。这是因为默认情况下整个记录 ([=26=]
) 将在 awk
中进行模式匹配。此外,print
是 awk
中的默认操作,这意味着如果条件计算结果为 true
且未指定操作,则 awk
将打印整个记录。
基于 Jonathan Leffler 的评论:
awk '[=10=] ~ /^control "[^"]+"[^"]*$/ { print }'
输出
control "text inside quotes" sometext sometext
这会查找带有控制和双引号的行,拒绝带有 1 个、3 个或更多引号的行。