标题: [文本处理] 批处理怎样替换文本指定内容? [打印本页]
作者: 786021512 时间: 2018-11-28 14:25 标题: 批处理怎样替换文本指定内容?
在目录下我有有些文本如下
&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进行替换
个人苦思冥想实在想不出,只能变其中一行后面就歇菜了
作者: yhcfsr 时间: 2018-11-28 16:23
BAT- @set @n=0/*&echo off
- dir /a-d/s/b *.txt|cscript -nologo -e:jscript "%~f0"
- pause&exit /b */
-
- var fso=new ActiveXObject('scripting.FileSystemObject');
-
- while(!WSH.StdIn.AtEndOfStream)
- {
- var result='';
- file=WSH.StdIn.ReadLine();//取得文件名
- fo=fso.OpenTextFile(file,1);//读取文件
- while(!fo.AtEndOfStream)
- {
- //正则,替换文件内容
- line=(fo.ReadLine()).replace(/(?=BATHOME)(.*NET(\d{3})WP(\d{4}).*,)\d+(,.*)/gi,'$1$2$3$4');
- result+=line+'\r\n';//保存结果
- }
- fo.close();
- file+='.log';
- fo=fso.CreateTextFile(file,true,false);//创建文件
- fo.Write(result);//输出结果
- fo.close();
- }
复制代码
作者: Batcher 时间: 2018-11-28 20:27
回复 1# 786021512
把你写的只能变其中一行的代码发出来看看,我来帮忙修改。
作者: 786021512 时间: 2018-11-29 10:48
回复 3# Batcher - @echo off%
- setlocal enabledelayedexpansion
-
- for /f "tokens=*" %%k in ('dir /b test.txt') do (
- for /f %%l in ('type "%%k"') do set STR=%%l
- for /f "tokens=2 delims=," %%j in ('find "BATHOME" "%%k"') do set old=%%j
- for /f "tokens=2 delims=(," %%i in ('find "BATHOME" "%%k"') do set new=%%i
- set newa=!new:~3,3!
- set newc=!new:~8,4!
-
- )
- echo !STR:%old%=%newa%%newc%!
-
-
- )
-
- PAUSE
复制代码
好人呀
作者: Batcher 时间: 2018-11-29 11:47
回复 4# 786021512
外层for循环的dir命令可以去掉,直接type文件名就行。
多次find会导致效率较低,delims设置多个列分隔符就行了。- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1-4 delims=(," %%a in ('type "1.txt" ^| findstr "(NET"') do (
- set str=%%b
- if "%%a" equ "BATHOME" (
- echo %%a(%%b,!str:~3,3!!str:~8,3!,%%d
- ) else (
- echo %%a(%%b,%%c,%%d
- )
- )
- pause
复制代码
作者: 786021512 时间: 2018-11-29 14:14
回复 5# Batcher
感谢!,但是我还想在请教一下,假设
BATHOME(NET589WP1234,666666,ACTION)
在ACTIO后面还有一节呢,这一节我是随机添加的
即
&ACCESS
;******BATHOME*******
BATHOME(NET589WP1234,666666,ACTION,GOOD)
BATHOME(NET892WP1256,666666,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,666666,ACTION,GOOD)
BATHOME(NET589WP1266,666666,ACTION)
BATHOME(NET789WP1235_P1,666666,ACTION)
怎样保留上面的信息并输出文本
当然还是要对666666这节进行更改
请谅解我啥都不懂
谢谢大神
作者: Batcher 时间: 2018-11-29 16:11
回复 6# 786021512
5楼代码
tokens=1-4
改成
tokens=1-3,*
作者: 786021512 时间: 2018-11-30 10:30
回复 7# Batcher
Thankyou,在请教下,我还想把整个文本给输出,该怎样做呢?
作者: Batcher 时间: 2018-11-30 11:33
回复 8# 786021512 - @echo off
- type "1.txt"
- pause
复制代码
作者: 786021512 时间: 2018-11-30 12:43
回复 9# Batcher
额,我想说的是怎样结合你的代码,输出来..
作者: Batcher 时间: 2018-11-30 13:29
回复 10# 786021512
type "1.txt"
把这行命令加到5楼代码里面,挑个你喜欢的位置,比如第2行下面或者第10行下面。
作者: 786021512 时间: 2018-11-30 13:38
回复 11# Batcher [/b
我还是不太会,加了以后又是原样输出了,666666那一行有不变了
原谅我跟不上节奏
作者: Batcher 时间: 2018-11-30 14:10
回复 12# 786021512
这个结果跟你8楼说的“还想把整个文本给输出”具体差异在哪里?
作者: Batcher 时间: 2018-11-30 14:14
回复 12# 786021512
如果你的意思是要把代码执行的结果输出到另外一个txt文件,可以试试这样:- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1-3,* delims=(," %%a in ('type "1.txt" ^| findstr "(NET"') do (
- set str=%%b
- if "%%a" equ "BATHOME" (
- echo %%a(%%b,!str:~3,3!!str:~8,3!,%%d
- ) else (
- echo %%a(%%b,%%c,%%d
- )
- ))>"2.txt"
复制代码
作者: 786021512 时间: 2018-11-30 14:28
回复 14# Batcher
我的意思把原来的文本内容进行替换并输出结果
原先内容中还含有标题
&ACCESS
等内容
现在只能输出更改的内容,原先的标题等会被去掉
作者: Batcher 时间: 2018-11-30 16:23
回复 15# 786021512 - @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1-3,* delims=(, eol=" %%a in ('type "1.txt"') do (
- if "%%b" equ "" (
- echo,%%a
- ) else (
- set str=%%b
- if "%%a" equ "BATHOME" (
- echo %%a(%%b,!str:~3,3!!str:~8,4!,%%d
- ) else (
- echo %%a(%%b,%%c,%%d
- )
- )
- ))>"2.txt"
复制代码
作者: 786021512 时间: 2018-11-30 16:42
回复 16# Batcher
啊啊啊,里面的内容虽然被替换了,但是开头行标题被省去了
作者: Batcher 时间: 2018-11-30 17:47
回复 17# 786021512
你用的测试数据是哪个?得到的结果跟预期相比少了哪一行?我试试
作者: xczxczxcz 时间: 2018-11-30 19:43
你们搞的好复杂啊:
P:- @echo off &cd/d "%~dp0"
- setlocal enabledelayedexpansion
- (for /f "eol= delims=" %%a in (ref.txt) do (
- echo %%a>tmp
- findstr /i "^BATHOME" tmp>nul && (
- for /f "tokens=1,2* delims=," %%i in (tmp) do (
- set "str=%%i"
- set "n1=!str:~11,3!"
- set "n2=!str:~16,4!"
- echo %%i,!n1!!n2!,%%k
- )
- ) || echo %%a
- ))>OK.txt
- del /q tmp
- pause
复制代码
PS版 用BAT运行- @echo off
- 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;}};"
- pause
复制代码
==================================================
作者: 786021512 时间: 2018-11-30 20:03
回复 18# Batcher
额是我看错了万分感谢
作者: WHY 时间: 2018-11-30 20:29
关于 eol
for /f "eol= delims=" %%i in (...) do ... 会忽略空格开头的行
for /f "delims= eol=" %%i in (...) do ... 会忽略引号开头的行
比较靠谱的办法:
for /f "delims="eol^= %%i in (...) do ...
作者: xp3000 时间: 2018-12-2 15:34
正则表达式轻松解决,灵活运用
作者: 786021512 时间: 2018-12-3 11:07
回复 19# xczxczxcz
大师在请教个问题,我用你的代码发现,我原先程序里面的空行会被去掉,或者
输出的内容会变成ECHO 处于关闭状态该怎么办呢?
作者: flashercs 时间: 2018-12-3 11:27
回复 23# 786021512
12行 改成echo,%%a
作者: xczxczxcz 时间: 2018-12-3 13:21
回复 23# 786021512
纯p一般会过滤掉空行。你按楼上大神的方法试下。用 下面的 PS 版看能不能达到要求,如果需要 则在 PS版中加入输出文本就可以了。
一般只按你楼顶给的样本写,不在样本范围内的一般不会考虑写到脚本内。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |