批处理之文本字符串处理

1. 基础

1.1. 写文件

1.1.1 重定向>输出至文本文件

	echo abc>123.txt
	ipconfig>ip.txt

1.1.2. 重定向>>追加信息到文本文件

	echo abc>>123.txt
	ipconfig>>ip.txt

1.2. 读文件

1.2.1. 重定向<读取文本文件

	rem 读取文本a.txt的内容,并按首行字母排序显示在控制台
	sort <a.txt
	rem 读取文本a.的内容,并按首行字母排序存放在当前目录的b.txt中
	sort <a.txt>b.txt
	set /p var=<file.txt
	echo %var%

1.2.2. type显示文本内容

	rem 读取并显示文本内容
	type a.txt
	rem 读取文本内容作为参数传递给sort
	type a.txt | sort

2. 示例

2.1. 从文本中分离奇数行和偶数行

	@echo off & title 隔行分拆为两个文件 
	setlocal enabledelayedexpansion
	set C=3.txt
	set B=2.txt
	set A=1.txt
	set Num=0
	for /f "delims=" %%a in ('type "%C%"') do (
	    if !Num! equ 1 (
	        (echo %%~a)>>"%B%"
	        set Num=0
	    ) else (
	        (echo %%~a)>>"%A%"
	        set /a Num+=1
	    )
	)
	pause

2.2. 逐行合并两个文本

	echo off & title 行插入合并为一个文件 
	setlocal enabledelayedexpansion
	set A=a.txt
	set B=b.txt
	set C=c.txt
	 
	(for /f "delims=" %%a in ('type "%A%"') do (
	    set "Str_A=%%a"
	    set Skip=skip=!Line!
	    if "!Skip!"=="skip=" set "Skip="
		rem 利用skip跳列B文件指定行,"!Skip!"是命令行参数
	    call :GetStr_B "!Skip!"
	    set /a Line+=1
	    echo !Str_A!
	    echo !Str_B!
	))>"%C%"
	pause
	exit
	 
	:GetStr_B
	for /f "%~1 delims=" %%b in ('type "%B%"') do (
	    set Str_B=%%b
		rem 可以理解为退出当前for循环
	    goto :eof
	)
	rem 执行到最后
	goto :eof

2.3. 遍历文本替换指定字符串

	@echo off
	echo %time%
	(
	rem delims指示分隔符,默认是空格和TAB
	    for /f "delims=" %%a in (test.txt) do (
	        set str=%%a
	        setlocal enabledelayedexpansion
	rem 空格替换成_
	echo !str: =_!
	        endlocal
	    )
	) >test_2.txt
	echo %time%
	pause

2.4. 操作多行文本

	rem ()表示其中的命令是一次执行,所以可以用<>一次操作多行文本
	(
		echo bcdefgdddddd
		echo bcdefg
	) >aaa.txt
	
	(
		setlocal enabledelayedexpansion
		set /p str=
		echo !str!
		set /p str=
		echo !str!
	) <aaa.txt
	pause

2.5. 合并多个文件

	rem type是将文件内容输出到指定设备,默认到控制台
	rem 将当前目录下所有txt合并到123.txt
	type *.txt >123.txt

2.6. 统计文本行数

	:: 非空行数
	findstr /n . FILENAME | find /c /v ""
	:: 总行数(包括空行)
	type FILENAME | find /c /v ""

2.7. 统计当前目录下所有包含“for"的行数

	@echo off
	setlocal enabledelayedexpansion
	for /f %%a in ('dir /b /s *.cpp *.h') do (
	    set n=0
	    for /f "delims=" %%j in ('type %%a ^| findstr /n "for" ') do (
	       set /a n+=1
		   echo %%j
	    )
	    echo !!n!
	)

2.8. 合并多行为一行

	@echo off
	setlocal enabledelayedexpansion
	set "SrcFile=a.txt"
	set "DstFile=b.txt"
	set "MergeNum=16"
	set "Delimiter=,"
	
	rem 清空目标文件
	type nul>"%DstFile%"
	for /f "usebackq tokens=*" %%a in ("%SrcFile%") do (
	    set /a RowTotal+=1
	    set /a Count+=1
		rem set后面加双引号,防止赋值的字符串中存在转义字符导致运行错误
	    set "RowMerge=!RowMerge!%Delimiter%%%a"
	    if !Count! equ !MergeNum! (
	        echo,!RowMerge:~1!>>"%DstFile%"
			rem 清除变量
	        set RowMerge=
	        set Count=0
	    )
	)
	
	set /a RowMod=RowTotal%%MergeNum
	if !RowMod! equ 0 (
	    goto :end
	)
	>>"%DstFile%" echo,!RowMerge:~1!
	:end

2.9. 删除空行

	@echo off
	set /p stringName=filePath:
	rem "^$"表示匹配空行, /v表示打印相反的,即打印非空行
	findstr /v "^$" %stringName% > result.txt
	pause

2.10. 删除包括指定内容的行

	@echo off
	set /p stringName=filePath:
	rem 正则表达式大小写敏感,用空格分隔多个正则表达式
	findstr /v ".for .For" %stringName% > result.txt
	pause

2.11. 生成规律的文本

	@echo off
	setlocal enabledelayedexpansion
	
	for /l %%a in (1,1,100) do (
		set /a num=1000+%%a
		if %%a LSS 10 (echo #define IDC_BUTTON%%a         !num!
		)else (
		if %%a LSS 100 (echo #define IDC_BUTTON%%a        !num!
		) else echo #define IDC_BUTTON%%a       !num!
		) 
		)
	pause

2.12. 通过截取修改文本内容

	@echo off
	setlocal enabledelayedexpansion
	set num=1000
	for /f "delims=" %%a in (c.txt) do (
		set /a num+=1
		rem 防止%%识别成字符所以加""
		set "newText=%%a"
		rem 截取前40个字符与数字合并
		echo !newText:~0,40!!num!
		)
	pause

2.13. 去掉重复内容

	@echo off
	rem 从A中读取一行与B中内容比较,没有则存放进B文件中
	for /f "delims=" %%i in (A.txt) do (
	find /i "%%i" B.txt || echo %%i>>B.txt
	)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章