替换某目录下某类文件中的字符串(脚本实现)

替换文件中字符串(脚本实现)

一、功能需求

​ 替换目录下(包括子目录)中某类文件中的字符串。

存在问题:

  • 包括子目录
  • 文件中存在空行
  • 系统关键字(感叹号!)冲突
  • 目录有空格

二、分析

提取文本信息:for /f

读取文件内容;提取某几行字符;截取某个字符片段;对提取到的内容再切分、打乱、杂糅……只要你所能想到的花样,for /f 都会想方设法帮你办到,因为,for /f 就是被设计成专门用于解析文本的。

系统关键字(感叹号!)冲突

延迟变量带来的一个问题就是,文本中的感叹号(!)被替换掉了。

解决办法就是,在给文件中字符串进行赋值前,使用endlocal禁用掉延迟变量。

命令行执行时路径不能出现空格的解决方法(推荐2和3相结合):

  1. 去掉路径中的空格
  2. 将整个路径用双引号引起来
  3. 使用usebackq选项

bat读取文本时,空行的判断

空行有两种类型,一种是不包括空格的换行,一种是包括空格的换行。

如果不判断空行,在使用echo时,会输出 echo处于关闭状态。这时如果需要对读取到的字符串进行替换操作,也会报错。

​ 尝试过echo.,但最后发现还是会延伸出来一些问题。因此需要对这两种情况进行判断。

  1. 不包括空行的判断,在使用for循环读取的时候,可以使用 if defined var判断
  2. 包括空格的判断,使用set var=!var: =!把空格替换掉,然后使用 if “!var!”==""进行判断

三、实现脚本(.bat)

@echo  off

echo ***** Replace "old" as "new" *****
rem 定义要替换的新旧字符串
set strOld=HantanIDE
set strNew=cyg
	
rem 循环查找.temp格式的模板文件并复制新文件
for /f "usebackq tokens=* delims=" %%a in (`dir /S *.mk makefile /b`) do (
    rem set后面的引号可以直接显示,解决findstr命令文件有空格的情况,确保!txt!包含有双引号。
    set txt="%%a"
	
	rem 后面要用到变量,因此此处启用延迟变量,解决!txt!所涉及变量。
    setlocal enabledelayedexpansion
	
	rem 开始逐行替换旧文件
	rem findstr   /i /n .* !txt! 查找字符串,/i不区分大小写,/n在每个匹配的行之前打印行号。.*所有文本。
	rem !txt!文件名,注意如果有空格时,确保字符串有双引号。
	for /f "usebackq eol== delims=" %%i in (`findstr   /i /n .* !txt!`) do (
	    rem 此处禁用延迟变量,以使能够正常读取字符,主要解决感叹号读取问题。
		endlocal		
		set "var=%%i"
		
		rem 后面要用到变量,因此此处启用延迟变量。
		setlocal enabledelayedexpansion
		rem findstr匹配的行之前打印行号eg 1:,去掉行号。即将第一个冒号之前的内容去掉
		set var=!var:*:=!
		rem 去掉空格。
		set tmp=!var: =!
		rem 排除无空格空行
		if defined var (
			rem 排除包含空格的空行
			rem if 不为空,else 包括空格的空行
			if /i not "!tmp!"=="" (	
			    set "var=!var:%strOld%=%strNew%!"
				rem 将处理后的每一行记录追加到temp.txt文件中
				(echo !var!)>>temp.txt
			) else (
				echo.!var!>>temp.txt
			)
		) else (
		rem 不包括空格的空行。
			echo.>>temp.txt
		)	
		rem 此处禁用延迟变量,以使下一次循环时,能够正常读取字符
		endlocal	
	)
		rem 在单个文件的每一行经过替换操作后,将处理后的文本从temp.txt临时文件剪贴到目标处理文件中(剪贴后临时文件会自动删除)
        move temp.txt "%%a"
)
pause

参考文献

菜鸟教程之shell教程:https://www.runoob.com/linux/linux-shell.html

批处理教程: https://www.yiibai.com/batch_script

for /f 用法详解:https://blog.csdn.net/yuntiank/article/details/7481264

FOR/F的选项usebackq的用法:http://www.bathome.net/thread-9512-1-1.html

各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别:https://blog.csdn.net/albertsh/article/details/102985590

读取字符串空行判断及系统关键字(感叹号!)冲突:https://blog.csdn.net/imston/article/details/25808681

Windows CMD中的findstr命令详解:https://blog.csdn.net/fuhanghang/article/details/83627792

BAT批处理中的字符串处理详解(字符串截取):
https://www.jb51.net/article/52744.htm

批处理中setlocal enabledelayedexpansion的作用详细整理:
https://www.jb51.net/article/29323.htm

dos 环境变量延迟扩展enabledelayedexpansion详解:https://www.jb51.net/article/97190.htm

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值