gensub确实不同于sub和gsub这2个工具,它有它更独特的魅力,下面我通过几个例子给大家讲解它的实际用法和独到之处。
  1. echo "11111"| awk 'BEGIN{FS=OFS=""}{$4="x";print}'

  2. 111x1

[解析] 这个时候阁下是不是看这段没有字段分割符的文本已经感到无从下手了?呵呵,经过这一系列的FS、OFS设置我们终于达到了目的,是不是很麻烦?我们再看看下面的例子。  
  1. echo "11111"| awk '{print $0=gensub("1","x",4)}'

  2. 111x1

  3. echo "11111"| awk '{print $0=gensub("1","x","g")}'

  4. xxxxx

[解析]

阁下是不是豁然开朗了很多?这就是gensub的便捷,在这里面不再需要字段分割符,用数字即可指定你要替换的某一位。g和G是指全局替换,要双引号标记起来。特别注意的是gensub是不会修改原记录的,所以要对$0进行一个赋值。“themodified string is returned as the result of the function and theoriginal target string is not changed”。接下来我们再看看一个更复杂的运用。

  1. echo "unix linux"| awk '{print gensub(/(.+)(.+)/,"\\2\\1","g")}'

  2. linux unix

  3. echo "xaax xbx xxx:xaax xbxxxx"| awk -F:-vOFS=":"'{$2=gensub(/x([^x]+)x/,"\\1YY",2,$2)}1'

  4. xaax xbx xxx:xaax bYYxxx

截取字符串:

echo "f<a>gaga<a>50000</a>4515gaga"| awk '{print gensub(".*<a>([0-9]+).*","\\1","1")}'

echo "f<a>gaga<a>50000</a>gaga"| sed -r 's/.*<a>([0-9]+).*/\1/g'

echo "f<a>gaga<a>50000</a>gaga"| grep -ioE "([0-9]+)"