Batch file 如何在批处理程序中提取特定字符后的单词?

Batch file 如何在批处理程序中提取特定字符后的单词?,batch-file,cmd,Batch File,Cmd,例如,我有一个文本文件test.txt,其中包含如下内容: 运行此脚本时: @echo off for /f "delims=$ tokens=1*" %%A in (test.txt) do echo %%B >> result.txt 结果是: 我希望结果是: 如何修复脚本?尝试以下脚本(请参阅代码中的说明性rem备注): @echo关闭 setlocal EnableExtensions DisableDelayedExpansion rem//在此处定义常量: 设置“\u

例如,我有一个文本文件
test.txt
,其中包含如下内容:

运行此脚本时:

@echo off
for /f "delims=$ tokens=1*" %%A in (test.txt) do echo %%B >> result.txt
结果是:

我希望结果是:

如何修复脚本?

尝试以下脚本(请参阅代码中的说明性
rem
备注):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u IFILE=test.txt”
设置“_OFILE=result.txt”
rem//存储换行变量:
(一套)=^
%=空行=%
^")
rem//写入结果文件:
>“%\u文件%”(
rem//循环浏览文本文件的行:
对于/F“usebackq delims=“%%L in”(“%\u IFILE%”)do(
rem//将当前行存储在变量中:
设置“行=%%L”
rem//切换延迟扩展,以便能够在同一代码块中写入和读取变量:
setlocal EnableDelayedExpansion
rem//用换行符替换每个“$”,并在结果行上循环,跳过第一行:
对于(^“!行:$^=^%LF%%LF%!^”)中的/F“skip=1”%%K,请执行以下操作(
rem//返回每行的第一个标记:
回声(%%K
)
端部
)
)
端部
退出/B
首先,它用换行符替换每个
$
,因此
test.txt的第一行变成:

Item1
23项目2
24
第二个是:

项目3
25
然后它从每个新形成的多行字符串中提取第一个空格或制表符分隔的标记,跳过第一行,因此只返回数字。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
对于(test.txt)do中的/f“delims=“%%A”(
对于%%T英寸(%%A),请执行以下操作(
设置“术语=%%T”
如果“!term:~0,1!”=“$”echo!term:~1!
)
)>>result.txt
端部

读取
%%A
的每一行。标记化为
%%T
。依次将每个标记分配给
术语
,检查第一个字符,如果
$
则回显该术语,但第一个字符除外。

这应该完全符合您的要求

@echo off
setlocal enabledelayedexpansion
(for /f "usebackq tokens=* delims= " %%i in ("test.txt") do (
    set "_br=%%i"
    echo(!_br: =^

!
  )
)>_tmp
(for /f "delims=$ tokens=*" %%a in ('type _tmp ^| find "$"') do echo %%a)>result.txt
注意必须按原样复制脚本。如下所示的脚本摘录会用新行替换空格,因此根本无法更改,位置和多余行必须保持原样,才能按预期工作

    echo(!_br: =^

!

这个脚本只是将每个单词分割成一个空格,并将其重定向到一个新文件,然后我们专门搜索包含
$
的单词,并只重定向这些命中的单词。

我决定发布这个示例,以展示一种解析每行并返回其他字符串的方法(不适用于有毒字符)

@(对于/F“UseBackQDelims=“%A In”(“test.txt”)Do@(设置为“i=0”)
对于%%B In(%%A)Do@(设置/A“i=(i+1)%%%2”&Cmd/V:On/Q/C退出!i!
如果不是错误级别1回声%%B))>“results.txt”
在您发布的示例代码和“想要的”结果中,如果字符串是$,您可能会使用这个想法来输出删除了第一个字符的字符串

@(对于/F“UseBackQDelims=“%A In”(“test.txt”)Do@(设置为“i=0”)
对于%%B In(%%A)Do@(Set/A“i=(i+1)%%%2”和SetLocal EnableDelayedExpansion
If!i!eq 0(设置“Val=%%B”&如果“!Val:~,1!”==”$”(Echo!Val:~1!
)Else Echo%%B)&EndLocal))>“results.txt”

谢谢您的帮助,但在我运行之后,结果是空的。@mkdarhdm现在可以工作了,等号前面缺少了一个插入符号
!LINE:$^=^%LF%%LF%!
非常感谢您的帮助,脚本运行得非常好。很抱歉,如果字数太多或行数太多,脚本显然无法工作o很多..那么你需要问一个新问题。简单来说:
jrepl“\$(\d+)”$txt=$1“/jmatchq/f”test.txt”/o“result.txt”
@compo:我必须停止这样做,直到我喝了咖啡。完全误读了Q。
23
24
25
@echo off
setlocal enabledelayedexpansion
(for /f "usebackq tokens=* delims= " %%i in ("test.txt") do (
    set "_br=%%i"
    echo(!_br: =^

!
  )
)>_tmp
(for /f "delims=$ tokens=*" %%a in ('type _tmp ^| find "$"') do echo %%a)>result.txt
    echo(!_br: =^

!