免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3313 | 回复: 4
打印 上一主题 下一主题

awk正则表达式的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-25 12:04 |只看该作者 |倒序浏览
在使用awk进行文本查找时发生以下错误,请教大家如何处理,对于特殊字符[做了转义无效,使用grep就可以

$ echo "[Section1]"|awk '{if($0 ~ "^\["){print $0}}'      
awk: 0602-521 There is a regular expression error.
        [] imbalance.

The source line number is 1.
The error context is
                {if($0 ~ >>>  "^\[") <<<

$ echo "[Section1]"|awk '{if(match($0,"^\[")>0){print $0}}'
awk: 0602-521 There is a regular expression error.
        [] imbalance.

The source line number is 1.
The error context is
                 >>> {if(match($0,"^\[") <<<

$ echo "[Section1]"|grep "^\["
[Section1]

论坛徽章:
0
2 [报告]
发表于 2010-05-25 12:08 |只看该作者
回复 1# net_lin
  1. echo "[Section1]"|awk '{if($0 ~ /^\[/){print $0}}'
复制代码
awk里面的正则匹配要放在斜杠里面,包括sed也是

论坛徽章:
0
3 [报告]
发表于 2010-05-25 12:13 |只看该作者
谢谢,如果我想匹配的字符串是通过传参进去的怎么处理?
$ echo "[Section1]"|awk -v str1="^\[" '{if($0 ~ /str1/){print $0}}'
$ echo "[Section1]"|awk -v str1="^[" '{if($0 ~ /str1/){print $0}}'
上面两句执行的结果都是空

$ echo "[Section1]"|awk -v str1="/^\[/" '{if($0 ~ str1){print $0}}'  
awk: 0602-521 There is a regular expression error.
        [] imbalance.

The input line number is 1.
The source line number is 1.

$ echo "[Section1]"|awk -v str1="^\[" '{if($0 ~ str1){print $0}}'  
awk: 0602-521 There is a regular expression error.
        [] imbalance.

The input line number is 1.
The source line number is 1.

论坛徽章:
0
4 [报告]
发表于 2010-05-25 12:26 |只看该作者
[需要]匹配,那就把[写成[[]
echo "[Section1]"|awk -v str1="^[[]" '{if ($0~str1) print $0}'

论坛徽章:
0
5 [报告]
发表于 2012-11-13 12:41 |只看该作者
echo "[Section1]"|awk '{if($0 ~ "^\\["){print $0}}'
awk在处理动态匹配的时候要分两步
1.读入字符串,这个时候要处理ESC转义
2.把读入的字符串当作正则表达式和左边的匹配
你这个代码echo "[Section1]"|awk '{if($0 ~ "^\["){print $0}}'   
第一步读入字符串的时候引号内部被转换成字符串^[。第二部把^[当作正则表达式的时候[是匹配的操作符,所以出错。需要再前面加\。所以在引号中要多加一个\,第一步或把引号内的东西转换成^\[

你的这两个代码中/str1/不会转换变量的,这是静态的匹配。就是匹配字符串"str1",要对变量匹配,必须要用动态匹配,也就是上面的那种
谢谢,如果我想匹配的字符串是通过传参进去的怎么处理?
$ echo "[Section1]"|awk -v str1="^\[" '{if($0 ~ /str1/){print $0}}'
$ echo "[Section1]"|awk -v str1="^[" '{if($0 ~ /str1/){print $0}}'
上面两句执行的结果都是空


可以参考"Effective AWK programming"的 chapter 3.8 using dynamic regexps
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP