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

[文本处理] 【已解决】批处理查找并替换字符串

[复制链接]
 楼主| 发表于 2013-11-4 22:36:54 | 显示全部楼层
回复 12# apang


    只是刚好我拿来测试的几个文件编码都不相同,能解决的话最好,不能或者解决起来麻烦的话就算了
 楼主| 发表于 2013-11-4 22:45:29 | 显示全部楼层
回复 15# terse


    昨天忘了看,今天又有事现在才回来,多谢了,还有楼上的几位也是
 楼主| 发表于 2013-11-5 00:10:14 | 显示全部楼层
回复 15# terse


    试了一下,发现文件名里有中括号的就会报一大堆错,不过这倒没什么关系,改下文件名就是了
发表于 2013-11-5 01:52:02 | 显示全部楼层
回复 18# yearharvest
新建 ! % ^ & 文件夹 (2)).txt
新建 ! % ^ & 文件夹 (2).txt
将你的附件 另存为上面两个文件 没提示错误
我再看看
 楼主| 发表于 2013-11-5 21:40:44 | 显示全部楼层
本帖最后由 yearharvest 于 2013-11-5 21:43 编辑

是中括号,比如把文件命名成  [a].txt
发表于 2013-11-6 23:00:50 | 显示全部楼层
回复 20# yearharvest
如此含中括号文件名还真不知道怎么处理 我发去PS版看下
不知还存在其他问题不  比如编码
发表于 2013-11-7 08:22:58 | 显示全部楼层
回复 16# yearharvest


    13楼的代码有问题吗?
 楼主| 发表于 2013-11-7 23:20:39 | 显示全部楼层
回复 21# terse


    编码没什么问题,也没发现其他问题
 楼主| 发表于 2013-11-7 23:21:49 | 显示全部楼层
回复 22# DAIC


    测试一下没发现什么问题
 楼主| 发表于 2013-11-7 23:41:03 | 显示全部楼层
本帖最后由 yearharvest 于 2013-11-7 23:42 编辑

回复 21# terse


    刚刚又发现一个问题,就是一行匹配多个的话只会处理最后一个。看代码是通过捕获组修改值然后字符串拼接起来,这样的话确实只能一行处理一个,像13的用replace函数的话就没问题。

    比如文件内容下面这种情况:
  1. \pos(100,200)\pos(100,200)\pos(100,200)
  2. \pos(300,400)\pos(300,400)
  3. \pos(500,600)
复制代码
发表于 2013-11-8 00:08:34 | 显示全部楼层
回复 25# yearharvest


    你这个人还真是奇葩,把你最终的要求更新到顶楼,很难吗?
像你这样没完没了地提要求,是对回复者的不尊重,说严重点,就是无理取闹
发表于 2013-11-8 09:50:12 | 显示全部楼层
本帖最后由 PowerShell 于 2013-11-8 11:00 编辑

1 楼主的提问,是有点【一次问一点问题,每次都不问全了】的意思
2 楼主每次加问的都是比较难的,比较关键的关键点.
3 正如各位用powershell回答的,powershell这种牛x语言处理之不再话下:
3.1 不管你啥编码,编写一小段函数 【Get-Encoding 】都能转换,识别,打开------powershell这盘菜大家逐渐吃出好味道来了么?我很欣慰呀呵呵.
3.2 带有中括号的文件,如 [a].txt 就用 -LiteralPath
3.3 powershell计算带小数点的数值,也不用多说了吧.
3.4 powershell 内置.net正则,查找替换无忧.

4 我不会答问题,也不会编码,只会吹,哈哈~~
 楼主| 发表于 2013-11-8 21:51:13 | 显示全部楼层
这确实是我的不对,麻烦各位了,这贴就这样结了吧,后面的我自己试着改改
发表于 2013-11-9 02:31:11 | 显示全部楼层
回复 28# yearharvest
http://bbs.bathome.net/thread-27238-1-1.html
虽然结贴了 还是PS 写了个 就不再这里贴了 链接里看下吧
发表于 2013-11-9 10:38:37 | 显示全部楼层
本帖最后由 PowerShell 于 2013-11-9 11:40 编辑

我也凑热闹来了,

  1. <#

  2. 把当前文件夹中指定后缀名的文件中的所有类似\pos(x,y)的字符串(x和y都是数字)替换成\pos(m*x,n*y),m和n也是数字。也就是字符串\pos(x,y)中的x和y乘上一个倍数。能支持各种文件编码

  3. 比如说a.txt里

  4. 01.\pos(100,200)\pos(100,200)\pos(100,200)

  5. 02.\pos(100,200)\pos(100,200)

  6. 03.\pos(100,200)
  7. 复制代码x乘1.5,y乘2的话变成

  8. 01.\pos(150,400)\pos(150,400)\pos(150,400)

  9. 02.\pos(150,400)\pos(150,400)

  10. 03.\pos(150,400)
  11. 复制代码
  12. #>


  13. $所有要处理的文件 =  Get-ChildItem -Path z:\pstemp\坛友yearharvest\*.txt   # -Recurse
  14. # 这里指定目录名,和文件类型

  15. [system.reflection.assembly]::loadwithpartialname("System.Text") | Out-Null
  16. [int32]$long = 1024 * 1024 * 128 #128MB
  17. $大字符串 = New-Object System.Text.StringBuilder($long)


  18. foreach   ($aaa   in   $所有要处理的文件)
  19. {
  20.                 # 正常情况下,无需编写 GetEncoding 函数。因为Get-Content将自动判断编码, 参见:
  21.                 #  powershell文件编码处理之妙~]
  22.                 #  http://www.bathome.net/thread-26673-1-3.html
  23.                 #  如果有不带bom头的utf8格式文档,需要指定编码utf8;如果有不带bom头的unicode格式文档,需要指定unicode。不指定的话讲被【默认地】认为是ansi格式文档。
  24.                 foreach   ($bbb   in  $(Get-Content -LiteralPath $aaa)  )
  25.                 {
  26.                                 #这题并不难,难在麻烦,不停地分行,分列,计算数值,然后再组合,不过代码不长。
  27.                                 $切割数组 =  $bbb -split '\\pos\('
  28.                                 $连成字串 = $切割数组   -join   ""
  29.                                
  30.                                 $切割数组2 =  $连成字串   -split  '\)'
  31.                                 $连成字串4 = ""
  32.                                 foreach ($ccc  in  $切割数组2)
  33.                                 {
  34.                                                 $切割数组3 =  $ccc  -split ','
  35.                                                 if  ($切割数组3.Length -gt 1)
  36.                                                 {
  37.                                                                 $连成字串3 =  "" + ($切割数组3[0] -as [Int64]) * 1.5 +  ',' + ($切割数组3[1] -as [Int64]) * 2
  38.                                                                 $连成字串4 =  $连成字串4 + '\pos(' + $连成字串3 + ')'
  39.                                                 }
  40.                                
  41.                                 }
  42.                                 #$连成字串4
  43.                                 $大字符串.AppendLine($连成字串4) | Out-Null
  44.                 }

  45. $目标文件名 = $aaa.Name + $aaa.Extension
  46. Add-Content  -Path $目标文件名  -value $大字符串 -Encoding Unicode
  47. }

  48. #测试通过

复制代码
假设你的文件名是 aaa。txt 则生成aaa。txt。txt ,内含处理结果。


层层分解,每层都很简单,powershell有强大的调试工具。 powershell python都这样。
比 搜索 替换 正则 + 那些绕脑袋的古怪的单行公式 来的容易, bash awk sed 三犯a罪b团c伙 都这样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 05:09 , Processed in 0.020797 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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