据了解,替换功能有sed,sub,gsub,gensub四种,下面分别讲解其应用方式。
数据源如下:
SNK17173 | 3=东方玄幻(传奇) | 2=网游 | 4=意境 | |||
SNK17173 | 3=东方玄幻(传奇) | 2=网游 | 4!=意境 | |||
SNK17173 | 3=东方玄幻(传奇) | 2!=网游 | ||||
SNK17173 | 3!=东方玄幻(传奇) | 5=Flash+视频 | 3=军事历史 | |||
SNK17173 | 3!=东方玄幻(传奇) | 5=Flash+视频 | 3!=军事历史 | 4=游戏原画 | ||
SNK17173 | 3!=东方玄幻(传奇) | 5=Flash+视频 | 3!=军事历史 | 4!=游戏原画 | 1=原创 | |
SNK17173 | 3!=东方玄幻(传奇) | 5=Flash+视频 | 3!=军事历史 | 4!=游戏原画 | 1!=原创 | 3=诱惑 |
SNK17173 | 3!=东方玄幻(传奇) | 5=Flash+视频 | 3!=军事历史 | 4!=游戏原画 | 1!=原创 | 3!=诱惑 |
SNK17173 | 3!=东方玄幻(传奇) | 5!=Flash+视频 |
如果我想替换除第一列外其他所有列中的3为字符A:
sed: cat test8.txt | sed 's/\(^[^\t]*\t\)3/\1A/g'
此处是OK的,但是如果换为1,就出问题了;cat test8.txt | sed 's/\(^[^\t]*\t\)*1/\1A/g';此处第一列中的1也被替换。
根据高手指点,此处用gensub做固定列以外的字符替换很OK。
gensub:cat test8.txt | awk '{printf $1" ";for(i=2;i<NF+1;i++)printf gensub(/1/,"50","g",$i)" ";print c}'
这里面有个很有意思的细节,print c 这个起到了换行的作用,而且C换成其他的字符也是同样的效果!
总结:sed在简单的全局正则替换上有优势,而gensub在部分列的局部替换有优势。