找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21439|回复: 8

[问题求助] gawk中FILENAME的替换

[复制链接]
发表于 2014-9-3 11:15:16 | 显示全部楼层 |阅读模式
本帖最后由 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位数的数字去掉最前面两位,然后输出
发表于 2014-9-3 13:58:05 | 显示全部楼层
  1. @gawk "BEGIN{FS=OFS=","}FNR==1{FILENAME=gensub(/[0-9]{2}([0-9]{5})/, "\\1", "g", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
tommytangtang + 1 好技术!

查看全部评分

 楼主| 发表于 2014-9-3 14:49:03 | 显示全部楼层
本帖最后由 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进行替换的次数
 楼主| 发表于 2014-9-3 15:06:31 | 显示全部楼层
DAIC 发表于 2014-9-3 13:58



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

用什么函数呢?当然前面要加的数值可以固定为“12”
 楼主| 发表于 2014-9-3 15:23:00 | 显示全部楼层
自己编了个用gsub
  1. @gawk "BEGIN{FS=OFS=","}FNR==1{gsub(/[0-9]{5}/,"12^&",FILENAME}{$1+=100;print>FILENAME}" *.txt
复制代码
把五位数字前面加上“12”

运行没结果。。。
 楼主| 发表于 2014-9-3 16:38:37 | 显示全部楼层
回复 2# DAIC


    问题又来了,求助。。。
    貌似引用是通知不到作者,只能回复
发表于 2014-9-4 13:12:10 | 显示全部楼层
回复 5# tommytangtang
  1. @gawk "BEGIN{FS=OFS=","}FNR==1{FILENAME=gensub(/[0-9]{5}/, "12^&", "g", FILENAME)}{$1+=100;print>FILENAME}" *.txt
复制代码
发表于 2014-9-4 13:12:30 | 显示全部楼层
回复 6# tommytangtang


    引用和回复都可以通知
 楼主| 发表于 2014-9-4 14:58:26 | 显示全部楼层
回复 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就不行了,抓狂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:49 , Processed in 0.018962 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表