在前面,我们讲到使用 skip= 来跳过不需要的行。但在实际使用中,我们需要更复杂的行筛选,该如何实现呢?由于这一功能主要是依靠其他命令完成的,且方法途径众多。所以仅举部分示例。下面批处理用来生成所需的被解析文件:
@echo off (echo hanye echo han echo guxing echo gu echo ye echo xing echo hanyeguxing)>>Hanyeguxing.txt |
1,筛选符合条件的行:
::示例47—显示行首是h,行尾是g的所有行
@echo off for /f "delims=" %%i in (Hanyeguxing.txt) do ( set Han=%%i setlocal enabledelayedexpansion if "!Han:~,1!!Han:~-1!"=="hg" echo !Han! ) pause |
2,筛选出符合条件的前一行。
::示例48—显示所有包含“xing”的行的前(上)一行
@echo off for /f "delims=" %%i in (Hanyeguxing.txt) do ( set Han=%%i setlocal enabledelayedexpansion if "!Han:xing=!" neq "!Han!" echo;!Ye! endlocal set Ye=%%i ) pause |
3,筛选出符合条件的后第二行。
::示例48—显示所有包含“han”的行的后(下)第二行
@echo off&setlocal enabledelayedexpansion set Ye=0 for /f "delims=" %%i in (Hanyeguxing.txt) do ( if !Ye! leq 1 ( if !Ye! equ 1 set /a Ye-=1 & echo;%%i set Han=%%i if "!Han:han=!" neq "!Han!" set Ye=2 ) else set /a Ye-=1 ) pause |
4,筛选某一特定行的前(上)、后(下)一行:
::示例49—找到行内容是“han”的行(就一行),并显示他的上一行和下行。
@echo off for /f "delims=" %%i in (Hanyeguxing.txt) do ( setlocal enabledelayedexpansion if defined found set "Xing=%%i" & goto Ye if "%%i"=="han" (set found=.) else set Gu=%%i ) :Ye echo 上一行:%Gu% echo 下一行:%Xing% pause |
5,使用 findstr 或 find 来实现上例要求:
::示例50—找到行内容是“han”的行(就一行),并显示他的上一行和下行。
@echo off for /f "delims=:" %%i in ('findstr /n "^han$" Hanyeguxing.txt') do set /a Han=%%i-2 for /f "skip=%Han% delims=" %%i in (Hanyeguxing.txt) do ( if not defined Han set "Xing=%%i" & goto Ye if not defined Gu (set Gu=%%i) else set Han= ) :Ye echo 上一行:%Gu% echo 下一行:%Xing% pause |
6,屏蔽筛选到的行和连续3行的内容:
::示例51—找到行内容是“han”的行,并不显示这一行以及连续三行的内容。
@echo off&setlocal enabledelayedexpansion set Ye=0 for /f "tokens=1,* delims=:" %%i in ('findstr /n .* Hanyeguxing.txt') do ( if !Ye!==0 ( set Han=%%j if "!Han:~,3!"=="han" (set Ye=3) else echo;%%j ) else set /a Ye-=1 ) pause |
7,筛选显示前3行(含空行)的内容:
::示例51—显示前三行的内容。
@echo off for /f "tokens=1,* delims=:" %%i in ('findstr /n .* Hanyeguxing.txt') do if %%i lss 4 echo;%%j pause |
|