批處理之文本字符串處理

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
	)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章