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

[文本处理] 批处理怎样替换文本指定内容?

在目录下我有有些文本如下
&ACCESS
;******BATHOME*******
BATHOME(NET589WP1234,666666,ACTION)
BATHOME(NET892WP1256,666666,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,666666,ACTION)
BATHOME(NET589WP1266,666666,ACTION)
BATHOME(NET789WP1235_P1,666666,ACTION)

想要变成
BATHOME(NET589WP1234,5891234,ACTION)
BATHOME(NET892WP1256,8921256,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,5231255,ACTION)
BATHOME(NET587WP1266,5871266,ACTION)
BATHOME(NET789WP1235_P1,7891235,ACTION)

也就是把第二节NET后面的3位数字+WP后面的四位数字替换,第三节666666内容
还有一点就是只能替换BATHOME行,不能对batman进行替换
个人苦思冥想实在想不出,只能变其中一行后面就歇菜了

回复 23# 786021512

纯p一般会过滤掉空行。你按楼上大神的方法试下。用 下面的 PS 版看能不能达到要求,如果需要 则在 PS版中加入输出文本就可以了。

一般只按你楼顶给的样本写,不在样本范围内的一般不会考虑写到脚本内。

TOP

回复 23# 786021512


    12行 改成echo,%%a

TOP

回复 19# xczxczxcz


    大师在请教个问题,我用你的代码发现,我原先程序里面的空行会被去掉,或者
输出的内容会变成ECHO 处于关闭状态该怎么办呢?

TOP

正则表达式轻松解决,灵活运用

TOP

关于 eol
for /f "eol= delims=" %%i in (...) do ... 会忽略空格开头的行
for /f "delims= eol=" %%i in (...) do ... 会忽略引号开头的行
比较靠谱的办法:
for /f "delims="eol^= %%i in (...) do ...

TOP

回复 18# Batcher
额是我看错了万分感谢

TOP

你们搞的好复杂啊:
P:
  1. @echo off &cd/d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. (for /f "eol= delims=" %%a in (ref.txt) do (
  4. echo %%a>tmp
  5. findstr /i "^BATHOME" tmp>nul && (
  6. for /f "tokens=1,2* delims=," %%i in (tmp) do (
  7. set "str=%%i"
  8. set "n1=!str:~11,3!"
  9. set "n2=!str:~16,4!"
  10. echo %%i,!n1!!n2!,%%k
  11. )
  12. ) || echo %%a
  13. ))>OK.txt
  14. del /q tmp
  15. pause
复制代码
PS版 用BAT运行
  1. @echo off
  2. PowerShell "$ErrorActionPreference='SilentlyContinue';Foreach ($line in (GC '.\ref.txt' -enc Default)){if ($line -match \"^BATHOME\"){$Array=@(($line.replace('NET','NET/').replace(',','/,/').Replace('WP','/WP/')) -Split('/'));$Array[5]=([string]$Array[1]+([string]($Array[3])).SubString(0,4));$Str='';(0..($Array.Count -1))|%%{$Str=[string]$Str+[string]$Array[$_]};Write-Host $str -fore Yellow;} else {$line;}};"
  3. pause
复制代码
==================================================
1

评分人数

    • 786021512: 感谢给帖子标题标注[已解决]字样技术 + 1

TOP

回复 17# 786021512


    你用的测试数据是哪个?得到的结果跟预期相比少了哪一行?我试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 16# Batcher


    啊啊啊,里面的内容虽然被替换了,但是开头行标题被省去了

TOP

回复 15# 786021512
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-3,* delims=(, eol=" %%a in ('type "1.txt"') do (
  4.     if "%%b" equ "" (
  5.         echo,%%a
  6.     ) else (
  7.         set str=%%b
  8.         if "%%a" equ "BATHOME" (
  9.             echo %%a(%%b,!str:~3,3!!str:~8,4!,%%d
  10.         ) else (
  11.             echo %%a(%%b,%%c,%%d
  12.         )
  13.     )
  14. ))>"2.txt"
复制代码
1

评分人数

    • 786021512: 感谢给帖子标题标注[已解决]字样技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 14# Batcher

我的意思把原来的文本内容进行替换并输出结果
原先内容中还含有标题
&ACCESS
等内容
现在只能输出更改的内容,原先的标题等会被去掉

TOP

回复 12# 786021512


如果你的意思是要把代码执行的结果输出到另外一个txt文件,可以试试这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-3,* delims=(," %%a in ('type "1.txt" ^| findstr "(NET"') do (
  4.     set str=%%b
  5.     if "%%a" equ "BATHOME" (
  6.         echo %%a(%%b,!str:~3,3!!str:~8,3!,%%d
  7.     ) else (
  8.         echo %%a(%%b,%%c,%%d
  9.     )
  10. ))>"2.txt"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 12# 786021512


    这个结果跟你8楼说的“还想把整个文本给输出”具体差异在哪里?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 11# Batcher [/b
我还是不太会,加了以后又是原样输出了,666666那一行有不变了
原谅我跟不上节奏

TOP

返回列表