[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 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位数的数字去掉最前面两位,然后输出

  1. @gawk "BEGIN{FS=OFS=\",\"}FNR==1{FILENAME=gensub(/[0-9]{2}([0-9]{5})/, \"\\1\", \"g\", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
1

评分人数

TOP

本帖最后由 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进行替换的次数

TOP

DAIC 发表于 2014-9-3 13:58



    那样如果要把“34567你好啊34567.txt“替换成“1234567你好啊1234567.txt”

用什么函数呢?当然前面要加的数值可以固定为“12”

TOP

自己编了个用gsub
  1. @gawk "BEGIN{FS=OFS=\",\"}FNR==1{gsub(/[0-9]{5}/,\"12^&\",FILENAME}{$1+=100;print>FILENAME}" *.txt
复制代码
把五位数字前面加上“12”

运行没结果。。。

TOP

回复 2# DAIC


    问题又来了,求助。。。
    貌似引用是通知不到作者,只能回复

TOP

回复 5# tommytangtang
  1. @gawk "BEGIN{FS=OFS=\",\"}FNR==1{FILENAME=gensub(/[0-9]{5}/, \"12^&\", \"g\", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码

TOP

回复 6# tommytangtang


    引用和回复都可以通知

TOP

回复 8# DAIC

谢谢了,代码可以运行。但是为什么我用gsub函数不能处理

看下面的代码就可以运行,不过名字是尾巴加A,如123.txt改成了123a.txt
  1. @gawk "BEGIN{FS=OFS=\",\"}FNR==1{sub(/\.[^\.]*$/,\"A^&\",FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
当然这里用的是sub只替换一次,照搬过去用gsub就不行了,抓狂

TOP

返回列表