Windows bat脚本学习四(字符串操作)
一、简介
在使用Bat批处理的时候,经常需要对字符串进行操作,所以这里单独写一篇文章介绍一下。
二、字符串相关操作
1.字符串切片
@echo off
chcp 65001
set string=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo %string%
echo.
echo 从第3个字符开始截取:
echo %string:~3%
echo.
echo 截取前5个字符:
echo %string:~0,5%
echo.
echo 截取最后5个字符:
echo %string:~-5%
echo.
echo 截取第一个到倒数第6个字符:
echo %string:~0,-5%
echo.
echo 从第4个字符开始,截取5个字符:
echo %string:~3,5%
echo.
echo 从倒数第14个字符开始,截取5个字符:
echo %string:~-14,5%
echo.
pause
结果:
2.替换字符串
@echo off
chcp 65001
set string=123456789
set string=%string:456=abc%
echo %string%
echo.
pause
结果:
3.字符串拼接
@echo off
chcp 65001
set str1=123456789
set str2=abcdefghi
set str3=zzz%str1% %str2%,xxx
echo %str3%
echo.
pause
结果:
4.字符串分割
delims
该关键字告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键。
例如,现在有个文件,内容如下:
编写如下代码:
@echo off
::chcp 65001
::不做分隔符
for /f "delims=" %%i in (a.txt) do (
echo %%i
)
echo.
::以":"作为分隔符
for /f "delims=:" %%i in (a.txt) do (
echo %%i
)
echo.
::以" "作为分隔符
for /f "delims= " %%i in (a.txt) do (
echo %%i
)
echo.
::以","作为分隔符
for /f "delims=," %%i in (a.txt) do (
echo %%i
)
echo.
::以"\"作为分隔符
for /f "delims=\" %%i in (a.txt) do (
echo %%i
)
echo.
pause
结果:
需要注意的是,如果以第一个字符作为分隔符,相当于获取该字符之后的内容。参考“以:作为分隔符”。
tokens
该关键字用来选取第几个元素,默认以空格和TAB作为分隔。
该关键字如果搭配delims使用。通过delims将每一行分为更小的元素时,有token来控制要取哪一个或哪几个。
修改一下a.txt文件
执行如下代码:
@echo off
chcp 65001
echo 选取所有元素
for /f "tokens=*" %%i in (a.txt) do (
echo %%i
)
echo.
echo 选取每行第二个元素(默认以空格或tab为分隔)
for /f "tokens=2" %%i in (a.txt) do (
echo %%i
)
echo.
echo 选取每行第二、第四个元素(默认以空格或tab为分隔)
for /f "tokens=2,4" %%i in (a.txt) do (
echo %%i %%j
)
echo.
echo 选取每行第二-四个元素(默认以空格或tab为分隔)
for /f "tokens=2-4" %%i in (a.txt) do (
echo %%i %%j %%k
)
echo.
echo 选取每行第二、第四个元素(以,作为分隔)
for /f "tokens=2,4 delims=," %%i in (a.txt) do (
echo %%i %%j
)
echo.
pause
结果:
skip
忽略文件的前几行。
还是刚才的a.txt。
如下代码:
@echo off
chcp 65001
echo 选取所有元素
for /f "tokens=*" %%i in (a.txt) do (
echo %%i
)
echo.
echo 选取每行第二个元素(默认以空格或tab为分隔)
for /f "tokens=2" %%i in (a.txt) do (
echo %%i
)
echo.
echo 跳过前两行,选取每行第二个元素(默认以空格或tab为分隔)
for /f "skip=2 tokens=2" %%i in (a.txt) do (
echo %%i
)
echo.
pause
结果:
分割多份
看如下代码:
@echo off
chcp 65001
::延迟环境变量扩展,不明白的看这个文章:https://blog.csdn.net/qq_26226375/article/details/122882619
setlocal enabledelayedexpansion
echo 定义如下字符串
set str=1,2,3,4,5,6,7
echo %str%
echo.
echo 将字符串以,进行分割,取第2-5个元素
echo.
for /f "tokens=2-5 delims=," %%a in ("%str%") do (
set part2=%%a
set part3=%%b
set part4=%%c
set part5=%%d
set part6=%%e
)
echo part2:!part2!
echo part3:!part3!
echo part4:!part4!
echo part5:!part5!
echo part6:!part6!
echo 因为tokens只取了2-5个元素,并未取第6个元素,所以part6=%%e赋值是错误的。
echo.
endlocal
pause
结果:
findstr
在文件中查找特定的字符串。如果搜索到,则打印出行内容。
find 参数 "要查找的字符串" 路径+文件名
参数
/i:不区分大小写的搜索
/n:打印匹配行的行号
/s:在当前目录及其所有子目录中搜索
/v:反向搜索,只打印不包含指定字符串的行
/r:使用正则表达式搜索
创建一个文件:
编写如下代码:
@echo off
chcp 65001
::延迟环境变量扩展,不明白的看这个文章:https://blog.csdn.net/qq_26226375/article/details/122882619
setlocal enabledelayedexpansion
echo 查找含有AA的字符串行,默认区分大小写
findstr "AA" a.txt
echo.
echo 查找含有BB的字符串行,不区分大小写
findstr /i "BB" a.txt
echo.
echo 查找含有CC的字符串行,并打印行号,不区分大小写
findstr /i /n "CC" a.txt
echo.
echo 查找含有DD的字符串行,不区分大小写
for /f "delims=" %%a in ('findstr /i /n "DD" a.txt') do (
set ret=%%a
)
echo !ret!
echo.
set first_char=%ret:~0,1%
echo 行号:%first_char%
echo.
endlocal
pause
结果: