我经常搞错的

200阅读 0评论2015-10-20 sync_1521
分类:LINUX

像aa11bb22 我想获取其中的bb字符串,我的思路就是替换,如将11bb22替换成bb
sed里这样写  s/11bb22/bb  
殊不知sed是整行读入,这样的效果只是将$0里面的11bb22替换成了bb,这个时候$0=aabb,默认输出的话就是aabb,与你要的bb相差甚远。
正确的做法是 s/aa11bb22/bb  


很多时候我在awk里面也放这种错误
像sub gsub gensub 函数等,你要明白的是假如你要获取整个$0里面的某个字段,那么你必须将整个 $0用正则表达式写出来,然后替换成你所要的,而不能只写某一部分的正则表达式。
其实真正造成这种误解的是我以为这种函数替换后,我潜意识以为返回的就是替换后的东西,这个潜意识是极其错误的。
这种函数不会返回任何东西,它只是将 $0 里面匹配到的正则表达式替换成你所要的,输出的时候还是以整个$0输出的,所以你要么将整个$0替换成你要的东西,否则别无他法。

另外一个例外就是match函数,这个很特殊,它会将$0里面匹配到的正则表达式放入数组,这种的话最适合你只要$0中的某个东西了,而不需要将整个$0用正则表达式写出来,如
echo "foooobazbarrrrr | gawk '{ match($0, /(fo+).+(bar*)/, arr)  #匹配到的部分自动赋值到arr中,下标从1开始
          print arr[1], arr[2]
          print arr[1, "start"], arr[1, "length"]  #二维数组arr[index,"start"]值=RSTART
          print arr[2, "start"], arr[2, "length"]  #二维数组arr[index,"length"]值=RLENGTH
    }'
 
 foooo barrrrr
 1 5
 9 7
上一篇:awk之tim精华帖
下一篇:awk变量引用