如何使用 FOR 在文件中查找字符串,去除空格,为其设置变量以获取令牌?

Posted

技术标签:

【中文标题】如何使用 FOR 在文件中查找字符串,去除空格,为其设置变量以获取令牌?【英文标题】:How to use FOR to find string in file, strip it of spaces, set variable to it for token? 【发布时间】:2018-06-15 01:16:48 【问题描述】:
@ECHO off
setlocal EnableDelayedExpansion
set "VAR=da da da YES123123"
echo %VAR% > testing.txt

FOR /F %%a in ('findstr "YES" .\testing.txt') do (
                                                 set BLAH=%%a
                                                 set "BLAH2=%BLAH: =%"
                                                 set "FINAL=%BLAH2:~15%"
                                                 echo %FINAL%
                                                 )

endlocal

无论是否使用“setlocal EnableDelayedExpansion”,批处理文件都无法正常工作。

但这就是我目前所拥有的一切。但是,我还想从 FINDSTR 字符串中删除前面的字符,但将一个变量设置为 FINDSTR 字符串并且它成功了 123123 个字符。不幸的是,它不起作用。它只输出“ECHO 已关闭”。

我在其他方面正确使用了 FOR,但这次我想不通。任何帮助将不胜感激。

【问题讨论】:

您需要调用延迟扩展 [数百篇关于此的 SO 文章 - 使用搜索功能] 以显示或使用在括号中的指令系列中更改的任何字符串变量的运行时值 (又名“代码块”)。 在本站搜索delayed expansion;或者,在循环之后进行子字符串提取,因为您的文件无论如何只包含一行...... 是的,我已经用 setlocal EnableDelayedExpansion 试过了。这是相同的结果,即使我将 % 更改为 ! (cookie除外) 您想要返回什么? YES123123?它总是最后一个“单词”吗? 【参考方案1】:

要获得最后一个单词,请使用普通的for 以默认分隔符(空格、制表符、逗号、=)分割您的字符串。无需知道,有多少代币。以下工作,即使YES 有更多行:

for /f "delims=" %%a in ('findstr "YES" .\testing.txt') do (
  for %%b in (%%a) do set final=%%b
  echo !final!
)

编辑找到YES直到行尾:

有一个令牌* 表示“所有其他人”,所以你可以这样做:

for /f "tokens=3,* delims= " %%a in ('findstr "YES" .\testing.txt') do echo %%b

但我推荐另一种方法(仅将 *YES 替换为 YES)。 set 可以进行有限的通配符替换(*string 有效,但 string* 无效)。优点:你不需要知道YES...是哪个token:

for /f "delims=" %%a in ('findstr "YES" testing.txt') do (
  set line=%%a
  echo !line:* YES=YES!
)

【讨论】:

非常感谢你!我对这个象征性的东西真的很难过!这行得通!【参考方案2】:

理解第一个含义Tokens 意思是只取标准输出的第 1 列或第 2 列或……

skip 表示从标准输出的文本列表中跳过第 1,2 行............

delims 表示这些列之间用什么(空格或点或斜线......)分隔的方式

【讨论】:

【参考方案3】:

好的,我想通了。不得不使用“token=1,2,3,4, delim= ”的东西,我讨厌使用它,而且它令人困惑,但以前曾将它用于其他目的。我只是对如何在命令末尾回显或将变量设置为令牌感到非常困惑。这是更正后的代码。

FOR /F "tokens=1,2,3,4 delims= " %%a in ('findstr "YES" .\testing.txt') do echo %%d

【讨论】:

FOR /F "tokens=4 delims= " %%a in ('findstr "YES" .\testing.txt') do echo %%a 也可以做到这一点——同样的逻辑,但写起来更短。 非常感谢。这个废话很难,我一直在花费数小时试图让它发挥作用,哈哈。我在这里搜索过这里的帖子。 再次感谢顺便说一句,如何将 YES123123(即令牌 4 或 %%d)更改为 YES 123 123 并仍然回显“YES 123 123”。当然空格是分隔符,不幸的是,txt文件最后会是通配符,我总是可以得到第4个标记,但是如果通配符字符串有空格,我不知道如何使用FOR对此进行调整!我不知道第四个令牌有多长或它有多少空间......所以很难! 我同意。你总是搜索YES<until end of line>? 我会知道“YES”将始终是字符串的一部分,但我不确定如何在变量 %%a 之后添加通配符数量的令牌。我只是不知道yes之后会发生什么。据我所知,它可能是“YES123123”,也可能是“YES 59 f 39 f3 f329 f###”。

以上是关于如何使用 FOR 在文件中查找字符串,去除空格,为其设置变量以获取令牌?的主要内容,如果未能解决你的问题,请参考以下文章

批处理,如何在for 中的 delims 中设置空格和其他字符做分隔符

python如何去除字符串里面的空格

JS中如何去除字符串的空格

怎么去除一个字符串的前后空格

c语言去除字符串左边空格、TAB键、换行符

在javascript中如何去除字符串两头的空格