Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2414392
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: 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,未测试,建议最好使用常量正则表达式。

阅读(3985) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

聆雨淋夜2015-04-08 09:16:23

明确来说就是为了避免让shell进行元字符扩展。  这句话错了,可以验证    使用单引号避免shell处理,还是需要2个\