我有一个完整的行文件,我想使用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}'
答案 0 :(得分:2)
首先,不能单独使用命名的字符类。它需要括在括号之间。否则它将被解释为字符类[:alph]
,意思是文字字符:
,a
,l
,p
和h
。
变化:
[:alpha:]
为:
[[:alpha:]]
其次看起来你错过了+
字符类之后的[[:alpha:]]
量词。 +
表示一个或多个。此外,您还应该在引号之间匹配空格。 (因为它们出现在测试数据中)。
应该是:
awk '/^control "[[:alpha:][:space:]]+" [[:alpha:]]+ [[:alpha:]]+$/'
可以缩短为:
awk '/^control "[[:alpha:][:space:]]+"( [[:alpha:]]+){2}$/'
顺便说一句,如您所见,您无需在$0 ~ /REGEX/{print}
中撰写awk
。您只需编写/REGEX/
即可。这是因为默认情况下,整个记录($0
)将成为awk
中模式匹配的主题。另外print
是awk
中的默认操作,这意味着如果条件评估为true
且未指定任何操作,则awk
将打印整个记录。
答案 1 :(得分:0)
基于Jonathan Leffler的评论:
awk '$0 ~ /^control "[^"]+"[^"]*$/ { print }'
<强>输出强>
控制“引号内的文字”sometext sometext
这会查找带有控制和双引号的行,拒绝具有1,3或更多引号的行。