标题: [问题求助] gawk中FILENAME的替换 [打印本页]
作者: tommytangtang 时间: 2014-9-3 11:15 标题: gawk中FILENAME的替换
本帖最后由 tommytangtang 于 2014-9-3 11:19 编辑
研究了一个多小时还是弄不出来,还是请教大神吧
@gawk "BEGIN{FS=OFS=\",\"}FNR==1{gsub(/[0-9]{7}/,\"/[0-9]{5}$/\",FILENAME)}{$1+=100;print>FILENAME}" *.txt
上面红色的我想表达的是把原文件名“1234567你好啊1234567.txt”替换成“34567你好啊34567.txt”
也就是说把文件名中7位数的数字去掉最前面两位,然后输出
作者: DAIC 时间: 2014-9-3 13:58
- @gawk "BEGIN{FS=OFS=\",\"}FNR==1{FILENAME=gensub(/[0-9]{2}([0-9]{5})/, \"\\1\", \"g\", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
作者: tommytangtang 时间: 2014-9-3 14:49
本帖最后由 tommytangtang 于 2014-9-3 15:07 编辑
回复 2# DAIC
感谢,刚刚搜了下gensub函数的用法
gensub(a,b,c[,d])全局替换,匹配正则a, 用b替换,c为指定替换目标是第几次匹配,d为指定替换目标是哪个域如$1,$2,若无d指$0,返回值为target替换后内容(未替换还是返回 target原内容),与sub、gsub不同的是,target内容替换后不改变。g和G是指全局替换,要双引号标记起来。
gensub(/123/,"x",1,$1)替换$1中 第一次匹配到的123为字符x,返回值为$1替换后的内容,且$1的内容并没有改变
gensub(/a(.*)b/,"\\1",1) 返回值为匹配正则第1对()内的内容
gensub(/a(.*)b(.*)c/,"\\2",1) 返回值为匹配正则第2对()内的内容
gensub(r,s,h,[, t]) 搜素变量$0,或目标字符串t(如果指定)以匹配正则表达式r。如果h是已g或G开头的字符串,则以s替换匹配的文本,如果h是一个数字,则表示用r进行替换的次数
作者: tommytangtang 时间: 2014-9-3 15:06
DAIC 发表于 2014-9-3 13:58
那样如果要把“34567你好啊34567.txt“替换成“1234567你好啊1234567.txt”
用什么函数呢?当然前面要加的数值可以固定为“12”
作者: tommytangtang 时间: 2014-9-3 15:23
自己编了个用gsub- @gawk "BEGIN{FS=OFS=\",\"}FNR==1{gsub(/[0-9]{5}/,\"12^&\",FILENAME}{$1+=100;print>FILENAME}" *.txt
复制代码
把五位数字前面加上“12”
运行没结果。。。
作者: tommytangtang 时间: 2014-9-3 16:38
回复 2# DAIC
问题又来了,求助。。。
貌似引用是通知不到作者,只能回复
作者: DAIC 时间: 2014-9-4 13:12
回复 5# tommytangtang - @gawk "BEGIN{FS=OFS=\",\"}FNR==1{FILENAME=gensub(/[0-9]{5}/, \"12^&\", \"g\", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
作者: DAIC 时间: 2014-9-4 13:12
回复 6# tommytangtang
引用和回复都可以通知
作者: tommytangtang 时间: 2014-9-4 14:58
回复 8# DAIC
谢谢了,代码可以运行。但是为什么我用gsub函数不能处理
看下面的代码就可以运行,不过名字是尾巴加A,如123.txt改成了123a.txt- @gawk "BEGIN{FS=OFS=\",\"}FNR==1{sub(/\.[^\.]*$/,\"A^&\",FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
当然这里用的是sub只替换一次,照搬过去用gsub就不行了,抓狂
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |