![Board logo](images/default/logo.gif)
标题: [文本处理] 批处理for逐行读取文本怎么做到不删除空行? [打印本页]
作者: lamcelot 时间: 2017-3-1 08:31 标题: 批处理for逐行读取文本怎么做到不删除空行?
本帖最后由 lamcelot 于 2017-3-2 09:31 编辑
某程序有config.ini文件,想要通过批处理修改里面address=字段后面的服务器ip指向,但是不能去除空行- @echo off
-
- setlocal enabledelayedexpansion
-
- set fileName=config.ini
-
- set /p ip=10.0.0.
-
- (for /f "delims=" %%i in ('type "%fileName%"') do (
- set "ipAddress=%%i"
- if "!ipAddress:address=!" neq "%%i" (
- echo address=10.0.0.%ip%
- ) else (
- echo,%%i
- )
- ))>%fileName%.temp
- move /y %fileName%.temp %fileName%
-
-
- pause
复制代码
修改程序的ini配置文件里面address=后面的ip地址目前已经可以实现。但是执行后会删除掉文件里面所有的空行。。。求大神指教
下面贴出关键部分的ini内容
;补打POS票据
gv_pos_bankinfo_bl=1
[server]
AppServer=10.0.0.34
10.0.0.34
login_appserver=10.0.0.34
[yb]
work_dir=C:\mzsf
code=02110003
dsn_name=ybdb
dsn_user=sa
dsm_passwd=123
dsn_passwd=123
还有一个问题,if默认是会区分大小写的,但是我的代码竟然会把login_appserver这行也给替换了,LZ现在很头疼正在考虑正则表达式或者findstr
作者: ygqiang 时间: 2017-3-1 09:07
回复 1# lamcelot - @echo off
- setlocal enabledelayedexpansion
-
- set file=config.ini
-
- set "file=%file:"=%"
- for /f "delims=" %%b in ("%file%") do (
- set lujing=%%~dpb
- set name=%%~nxb
- )
- title %lujing% %name%
- echo %lujing%%name%
- pause
-
- set /p chazhao=输入查找内容(区分大小写)
-
- find "%chazhao%" "%file%"
- for /f "delims=" %%c in ('find "%chazhao%" "%file%" /c') do set jieguo=%%c
- set "jieguo=%jieguo:*txt: =%"
- echo %name%中包含“%chazhao%”的共有 %jieguo% 行。
-
- set /p tihuan=输入替换内容
-
- :check
- set /a num+=1
- if not exist "%lujing%new%num%_%name%" (
- copy nul "%lujing%new%num%_%name%"
- ) else (
- goto check
- )
- for /f "delims=] tokens=1*" %%i in ('find "" /v /n "%file%"') do (
- set str=%%j
- if "!str!"=="" (
- echo.
- ) else (
- echo;!str:%chazhao%=%tihuan%!
- )
- )>>"%lujing%new%num%_%name%"
- echo 处理完毕&pause>nul
- start "" "%lujing%new%num%_%name%"
复制代码
作者: 回家路上 时间: 2017-3-1 09:22
- for /f "tokens=1*,delims=:" %%i in('findstr /n . "%fileName%"') do echo;%%j
复制代码
作者: lamcelot 时间: 2017-3-1 11:01
回复 2# ygqiang 哥哥能不能在我的代码上改改啊 你这个太复杂了我不怎么看的懂
作者: lamcelot 时间: 2017-3-1 11:01
回复 3# 回家路上
重点还是findstr /n吧?
作者: taofan712 时间: 2017-3-1 11:42
2楼代码里面,31到38行就是不删除空行进行替换。自己动手改啊。
作者: ygqiang 时间: 2017-3-1 14:51
回复 4# lamcelot
通过批处理修改里面address=字段后面的服务器ip指向
具体查找的关键字是?替换的关键字是?
作者: lamcelot 时间: 2017-3-1 15:32
回复 7# ygqiang
格式固定是 address=... 后面的ip地址是10.0.0.? 的形式,但最后一位是不确定的,通过这个batch输入对这个ip地址的末位进行修改
作者: ygqiang 时间: 2017-3-1 16:35
回复 8# lamcelot
最后一位是不确定的??
那2楼的代码,解决不了你这个问题。
作者: lamcelot 时间: 2017-3-1 16:57
回复 9# ygqiang
我自己写的代码可以实现功能 但是会删掉空行
作者: ygqiang 时间: 2017-3-1 20:24
回复 10# lamcelot
额。我有个需求跟你类似。
http://www.bathome.net/thread-43349-1-1.html
作者: GNU 时间: 2017-3-1 20:41
- @echo off
- setlocal enabledelayedexpansion
- set fileName=config.ini
- set /p ip=10.0.0.
- (for /f "tokens=1*,delims=:" %%h in('findstr /n . "%fileName%"') do (
- set "ipAddress=%%i"
- if "!ipAddress:address=!" neq "%%i" (
- echo address=10.0.0.%ip%
- ) else (
- echo,%%i
- )
- ))>%fileName%.temp
- move /y %fileName%.temp %fileName%
- pause
复制代码
作者: ygqiang 时间: 2017-3-1 20:58
回复 12# GNU
经过测试,你这个代码并没有修改ini文件里面的ip地址。
比如ini文件里面有一行:address=10.0.0.8
作者: GNU 时间: 2017-3-1 21:07
回复 13# ygqiang
你跟楼主是同一个人吗?如果不是的话,我想等等楼主本人的测试结果。也许你们的环境不一样。
我的代码没有改动楼主原来的“修改”功能,仅仅是增加了“不去除空行”功能。
作者: ygqiang 时间: 2017-3-1 21:14
回复 14# GNU
为啥用了1楼的代码,是可以修改ini文件里面的ip地址的?
你的代码,就不行。
比如ini文件里面有一行:address=10.0.0.8
作者: taofan712 时间: 2017-3-1 22:13
请展示下ini文件中的部分内容
作者: ygqiang 时间: 2017-3-2 09:05
本帖最后由 ygqiang 于 2017-3-2 09:07 编辑
- @echo off
- setlocal enabledelayedexpansion
- del /q newconnection.ini
- echo;输入新ip,按回车 &set /p "rip="
- for /f "tokens=1* delims==" %%a in ('findstr "svrIP=" connection.ini' ) do set tip=%%b
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* connection.ini') do (
- set str=%%j
- if "!str!"=="" (
- echo;
- ) else (
- echo;!str:%tip%=%rip%!
- )
- )>>newconnection.ini
复制代码
作者: lamcelot 时间: 2017-3-2 09:30
本帖最后由 pcl_test 于 2017-3-2 09:39 编辑
回复 16# taofan712
顶楼已更新给出
作者: taofan712 时间: 2017-3-2 09:40
回复 18# lamcelot
18楼代码第五行处,可以考虑把行号一起获取,在替换的时候对比行号。就像userx那问题,其实我是对比着行号在处理,你可以参考下。
作者: Nsqs 时间: 2017-3-2 11:06
- @echo off
- set "fileName=config.ini"
- for /f "tokens=1 delims=:" %%1 in ('findstr /n "^::VBS$" "%0"')do set n=%%1
- more "%0" +%n%>@
- type %filename%|cscript -nologo -e:"vbs" "@">%filename% %读取文件config%
- pause
- ::以下是你自定义代码部分
-
-
- ::此行以下不要修改
- goto :eof
- ::VBS
- set fso=createobject("scripting.filesystemobject")
- set regexp=new regexp
- s="999" '替换为999
- with regexp
- .multiline=-1:.global=-1
- .pattern="^(address=).*" '需要匹配修改的部分
- wsh.echo .replace(wsh.stdin.readall,"$1"&s)
- end with
- fso.deletefile wsh.scriptfullname
复制代码
作者: taofan712 时间: 2017-3-2 13:24
- @echo off
- set /p rip=输入替换IP(如10.10.10.10)
- findstr /n .* connection.ini>temp.ini
- for /f "tokens=1* delims=:" %%a in ('findstr /b /n svrIP= connection.ini') do (
- set /a tn=%%a
- for /f "tokens=2 delims==" %%c in ("%%b") do set tip=%%c
- )
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in (temp.ini) do (
- set /a ln=%%i
- set line=%%j
- if !ln! equ !tn! (
- echo;!line:%tip%=%rip%!
- ) else (
- echo;!line!
- )
- )>>newconnection.ini
- del /f /q temp.ini
复制代码
作者: GNU 时间: 2017-3-2 23:05
回复 21# taofan712
1、获取IP和获取IP所在的行号,两个操作可以合并在同一个for命令里面完成。
2. temp.ini这个临时文件是多余的,直接在后面那个for里面用命令替换就行了。
3、最后那个for命令里面ln这个变量是多余的。- @echo off
- set /p rip=输入替换IP(如10.10.10.10)
- for /f "tokens=1,3 delims=:=" %%a in ('findstr /b /n "AppServer=" 1.ini') do (
- set tn=%%a
- set tip=%%b
- )
- setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%i in ('findstr /n .* 1.ini') do (
- set "line=%%j"
- if %%i equ !tn! (
- echo;!line:%tip%=%rip%!
- ) else (
- echo;!line!
- )
- ))>2.ini
复制代码
作者: WHY 时间: 2017-3-3 13:21
- @echo off
- set /p Input=输入:
- for /f "delims=" %%i in ('findstr /n .* 1.ini') do (
- set "s=%%i"
- setlocal enabledelayedexpansion
- set "s=!s:*:=!"
- if /i "!s:~0,10!" == "AppServer=" (
- echo;AppServer=%Input%
- ) else (
- echo;!s!
- )
- endlocal
- )
- pause
复制代码
- @if (0)==(0) echo off
- set /p Input=输入:
- cscript //nologo //e:jscript "%~f0" < 1.ini "%Input%"
- pause & goto :EOF
- @end
-
- var s = WSH.StdIn.ReadAll().replace(/^(AppServer=)[^\r\n]*/gmi,'$1' + WSH.Arguments(0));
- WSH.Echo(s)
复制代码
- set "Input=1.1.1.1"
- gawk "BEGIN{IGNORECASE=1};{sub(/^AppServer=.*/,\"AppServer=%Input%\",$0);print}" 1.ini
复制代码
- set "Input=1.1.1.1"
- sed -r "s/^(AppServer=).*/\1%Input%/" 1.ini
复制代码
- set "Input=1.1.1.1"
- PowerShell -c "(type 1.ini) -replace '(?<=^AppServer=).*', '%Input%'"
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |