BAT批处理方式进行文件的字符串搜索替换
在matlab提取txt中的实验数据,由于记录原因,传感器出错后把数字存为了nan,对于提取数据很不方便。
于是查了查如何批处理对txt文本进行替换。
CMD/BAT 批处理的方式,进行文件的字符串搜索替换工作,参考博客
@echo off
setlocal EnableDelayedExpansion
set "CurrCD=%~dp0"
set "strOld=aaaaa"
set "strNew=zzzzz"
:: 将当前目录(包括子目录)下的所有 TXT 文本中的 aaaaa 替换为 zzzzz
for /f %%i in ('dir /b /s /a:-d *.txt') do (
powershell -Command "(gc %%i) -replace '%strOld%', '%strNew%' | Out-File -Encoding ASCII %%i"
)
基本语法解释:
在cmd中输入 命令 /?
可显示此命令的帮助信息
@echo off: 此语句常用于开头,表示不显示所有的命令行信息,包括此句
set :
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
for循环的基本格式
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
参数:FOR有4个参数 /d /l /r /f
FOR /D %%variable IN (set) DO command [command-parameters]
含义:如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /D %%variable IN (set) DO command [command-parameters]
含义:如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
含义:检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
含义:该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。
/F 迭代及文件解析
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。
dir命令
参考博客
/s 查找当前目录以及所有子目录下的文件
/b 舍弃标题与摘要内容
/d 跟宽式相同,但文件是按栏分类列出的。
/n 长列表格式 即 竖立格式 与光杆dir 下无异
/b /a:d 指定显示所有具有该属性的文件
/b /d&/w 交互使用时,/d&/w 开关 无效。
/q 显示文件所有权信息、或者说文件所有者信息
/w 宽行格式显示 X轴序列 文件名过长 无效
/d 宽行格式显示 Y轴序列 文件名过长 无效
/d & /w 会在在文件夹的前后添加"[]"X
/l 所显示文件名,全部为小写英文字母。
/c&/-c 禁用文件大小显示千位数分隔符。默认显示分隔符“,” /-c 不显示分隔符。
/a:d 只显示文件夹(包括隐藏文件夹)
/a:h 只显示隐藏文件 (包括具有当前属性的其他三种文件、夹)
/a:r 仅显示只读文件(包括具有当前属性的其他三种文件、夹)
/a:s 仅显示系统文件(包括具有当前属性的其他三种文件、夹)
/a:a 只显示存档文件- - X----- 只显示文件 (包括具有存档属性的其他三种属性文件) 这个命令对应 /a:d 只显示文件夹。
windows中文件共有四种属性、
分别为 存档、只读、系统、隐藏
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序)
S 按大小(从小到大)
E 按扩展名(字母顺序)
D 按日期/时间(从先到后)
G 组目录优先
- 反转顺序的前缀
逐个解释dir /b /s /a:-d *.txt
/b 舍弃标题与摘要内容
/s 查找当前目录以及所有子目录下的文件
/a:-d 只显示文件不显示文件夹
*.txt 要求仅显示txt文件
编码问题解释:在Out-File后加-Encoding ASNII
即可实现改变输出文本的编码,默认编码为UTF-16 LE
有意思的是,-Encoding utf8
输出编码为带有BOM的utf8
后续继续研究powershell的相关语法和命令
补充:
如何删除包含特定字符串的所有行呢?
@echo off
setlocal EnableDelayedExpansion
:: 删除 d:\aaa.txt 中,包含字符串 abc 的所有行
set "FileName=d:\aaa.txt"
set "sDelLine=abc"
powershell -Command "$data = foreach($line in gc %FileName%){ if($line -notlike '*%sDelLine%*') {$line}} $data | Out-File %FileName%"