我不确定这是否容易实现。我可以轻松解析包含相同信息的任何行。如果我想找到 test.txt 中包含账单信息的所有行,我可以这样做
findstr /c:"Billing" test.txt
但是如果我想要
findstr
结果之后的那一行怎么办?在此示例中,我想尝试查找用户注释,但它们位于下面的行中。
编辑: 随机字符串正是如此。它们不包含相似的字符。此外,实际文件包含数百行,而不仅仅是我作为示例包含的四行。
Billing Info 1234
PayPal Manage Payment
User Notes:
ABC RANDOM STRING
Billing Info 5678
PayPal Manage Payment
User Notes:
DEF RANDOM STRING
Billing Info qwerty
PayPal Manage Payment
User Notes:
XYZ RANDOM STRING
我认为可以用
for loop
和 skip
标志来完成一些事情。
for /f "skip=1 tokens=1*" %a in ('findstr /c:"User" test.txt') do (echo %a %b)
但我认为
skip
在文件开头而不是在每个结果处跳过行。
如果这是显而易见的痛苦,我深表歉意,感谢您的任何帮助或建议。
罗里
FINDSTR 不能在这里使用,因为它总是逐行处理文本文件。无法搜索另一行下方的行或指示 FINDSTR 在包含找到的字符串的行下方或上方输出其他行。
以下批处理文件代码可能有效:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "test.txt" exit /B 1
set "UserNotes="
for /F usebackq^ delims^=^ eol^= %%# in ("test.txt") do for /F tokens^=1^,2^ eol^= %%I in ("%%#") do (
if "%%I %%J" == "Billing Info" (
set "UserNotes="
) else if "%%I %%J" == "User Notes:" (
set "UserNotes=1"
) else if defined UserNotes (
echo(%%#
)
)
endlocal
外部 FOR /F 循环处理文本文件,仅忽略空行。由于定义了空分隔符列表并且没有行结束符,每个非空行都按原样分配给指定的循环变量
#
。此处必须使用不使用 "
的语法,因为这是指定无分隔符和行结束符的唯一可能性。
内部 FOR /F 循环通过使用普通空格和水平制表符作为字符串分隔符将行拆分为子字符串(标记)来处理当前行。行尾字符再次定义为没有字符,因为输出的用户注释也可以在零个或多个前导空格/制表符后以分号开始,内部 FOR /F 循环不应忽略这些空格/制表符。只有前两个空格/制表符分隔的字符串是有意义的,因此被分配给循环变量
I
和 J
。
第一个 IF 条件在当前行上为真,以两个字开头,表示新数据块开始,这意味着前一个数据块的用户注释部分结束。在这种情况下,环境变量
UserNotes
被删除。
第二个 IF 条件在当前行上为 true,以两个单词开头,表明接下来是用户注释。因此,环境变量
UserNotes
定义了一个值。价值本身并不重要。
仅当其他两个 IF 条件为 false 并且当前定义了环境变量 UserNotes
时,第三个
IF条件才为 true。在这种情况下,带有用户注释的非空行当前由外部 FOR /F 分配给循环变量
#
,该变量现在输出(或进一步处理)。
使用
echo(%%#
而不是 echo %%#
来输出正确的用户注释行,其中仅包含空格/制表符,不包含任何其他内容(空白但不是空行)。在这种情况下,使用 echo %%#
将导致输出命令回显模式的当前状态。使用 (
作为命令 ECHO 和要输出的非空行之间的分隔符,可以防止在要输出的空行上输出命令回显模式的状态。
如果要将所有用户注释写入当前目录中的文本文件(如
UserNotes.txt
),可以使用以下批处理文件。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "test.txt" exit /B 1
set "UserNotes="
(for /F usebackq^ delims^=^ eol^= %%# in ("test.txt") do for /F tokens^=1^,2^ eol^= %%I in ("%%#") do (
if "%%I %%J" == "Billing Info" (
set "UserNotes="
) else if "%%I %%J" == "User Notes:" (
set "UserNotes=1"
) else if defined UserNotes (
echo(%%#
)
))>"UserNotes.txt"
if exist "UserNotes.txt" for %%I in ("UserNotes.txt") do if %%~zI == 0 del "UserNotes.txt"
endlocal
文件
UserNotes.txt
在之前创建时被删除,但没有任何内容输出到该文件中。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
del /?
echo /?
endlocal /?
exit /?
findstr /?
for /?
if /?
set /?
setlocal /?