- 论坛徽章:
- 1
|
原帖由 iceberg77 于 2008-1-30 17:05 发表 ![]()
'|'是元字符, 我想用awk -F'\|\|' 就行了, 结果提示:
awk: warning: escape sequence `\|' treated as plain `|'
用这个 awk -F'\\|\\|' 才可以
望大侠解疑
很遗憾,awk对正则的支持相当有限,但这不是没有原因的。
awk的语法力图模仿C,所以字符串的转义序列是照搬C的,如\a表示蜂鸣,\t表示水平制表,\n表示换行,\b表示退格, \f表示换页等等。
除开那些C风格的转移序列之外的转义序列,如\q, \|之类,大多数awk版本处理时会简单地把反斜杠\丢弃,所以你写\q,awk会当作普通字符q,写\|,awk会当作普通字符|。但gawk这样做时会提示用户,这就是awk为什么会发出类似escape sequence `\|' treated as plain `|'这样的警告的原因了。还有一些版本的awk会认可这些非C风格的转移序列,据我所知debian缺省安装的的mawk就是如此。
因此正则表达式中经常用到的转义方式都需要用两个反斜杠,写成有点怪异的样子。例如你上面提到的\\|,还用gawk中gensub中才能使用的反向引用必须写成\\1, \\2而不是简单的\1, \2。
总之,在awk中用正则有时会比较头疼,如果你的正则比较高级点,建议改用sed,尤其建议改用perl。^_^ |
|