全部博文(298)
分类: Python/Ruby
2012-04-26 16:23:58
AWK的动态正则
的右边不一定是一个常量正则表达式(字符串在‘//’之间,比如’/pattern/’),它可以使任何表达式,这个表达式被计算和转换成一个字符串,在有必要的情况下,这个字符串的内容被用作正则表达式,用这种方式计算的正则表达式叫做动态正则表达式(动态正则),例如:
BEGIN { = "[A-Za-z_][A-Za-z_0-9]+" } #无’//’ $0 ~ identifier_regexp { print }设置identifier_regexp为一个正则表达式,使用awk变量在存储,然后测试输入的记录是否匹配这个正则表达式。 注意:当使用‘~’和’!~’操作的时候,使用’//’的常量正则表达式和使用双引号的字符串常量有一点不同,如果你要使用字符串常量,你必须懂得字符串实际上市被扫描了两次,第一次是awk读取你的程序的时候,第二次是使用操作右边的模式匹配左边的字符串的时候,这是任何字符串值的表达式(例如上面的identifier_regexp,为一个变量表达式),不仅仅是常量字符串。
如果字符串被扫描两次,它有什么不同呢?答案是必须做转义序列,特别是使用反斜杠,为了在字符串的正则表达式里面获取一个反斜杠,你必须键入两个反斜杠。
例如:/\*/是一个为了匹配字面意义的’*’常量正则表达式,仅使用一个反斜杠,为了在字符串中做同样的事情,你必须键入”\\*”,第一个反斜杠转义第二个反斜杠,视为了让字符串包含两个字符’\’和’*’,明确来说就是为了避免让shell进行元字符扩展。
你也可以在match函数中使用动态正则表达式,其余gsub,sub,gensub,未测试,建议最好使用常量正则表达式。