【问题标题】:tokens and delims expert help needed需要代币和定界线专家帮助
【发布时间】:2016-11-24 10:41:29
【问题描述】:

我最近一直在使用批处理来完成我的工作,并且在这里和那里使用少量的 power shell 来产生很好的效果。

总是让我感到困惑的一件事是在循环等工作时的标记和定界概念。我看过你管视频并阅读它上面的经典 rob van 页面。我有点明白,但是当我需要使用它时,它不是基本的。

我有一个例子,如果有人能很好地解释你如何选择令牌和分隔符的数量,那将非常有帮助。我需要从网页的各个列中推断出 PC 主机名。我可以将文本复制到文本板中,并希望仅将计算机名称“回显”到另一个文件中。

24 Nov 2016 09:45 GMT   194.176.105.132 United Kingdom  ID006962.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:44 GMT   194.176.105.154 United Kingdom  ID006976.CENTRAL    3.10.5.0    Remove
24 Nov 2016 09:43 GMT   194.176.105.146 United Kingdom  ID007634.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:41 GMT   194.176.105.138 United Kingdom  ID006961.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:28 GMT   194.176.105.132 United Kingdom  ID007643.CENTRAL    3.10.5.0    Remove

计算机名称是 ID0006962 数字,但我不需要尾随的 .CENTRAL。从这个文本中,我只需要另一个带有主机名的文本文件。我可以做所有这部分,它只是外推数据元素。有时列表很大,最好保存到一个文本文件中,对它运行一个 for 循环并吐出另一个只有主机名的文本文件。我想如果我能更深入地了解这一点,我也可以将这些知识应用到我需要做的其他事情上。非常感谢任何提示!

另一个文本文件中的示例输出(我想要):-

ID006967                                                             
ID007566                                                               
ID007567                                                              
ID006976    
ID007643     

编辑我怎样才能在主机名旁边获得 3.10.6.0 等

ID006967     3.10.6.0                                                         
ID007566     3.10.6.0                                                          
ID007567     3.10.6.0                                                         
ID006976     3.10.6.0
ID007643     3.10.6.0

我已经尝试过了,但迷路了,这就是我的想法......

@echo off

> "%~dp0test.txt" (
    for /F "usebackq tokens=4,5 delims= " %%J in ("%~dp0rob.txt") do @(
        for /F "tokens=1,3,4,5,6 delims=." %%I in ("%%J") do @echo(%%I
    )
)

所以我的想法 (LOL)...我希望将 4,5 个标记(第 4 列和第 5 列)提取到 %%J 我希望下一个循环回显附加标记以及主机名,所以仍然使用 ' 。作为此测试中第 4 行和第 5 行的分隔符,我相信现在有 6 个令牌可供选择....但输出仍然只显示主机名...我没有得到什么

ID006962(t1).CENTRAL(t2) 3(t3).10(t4).6(t5).0(t6)

【问题讨论】:

  • "Delims= ." 多个分隔符被视为一个。数一下有多少. 和` `(我认为是12 个)分隔标记。所以第 12 个字母是 L。所以 For /f "delims=12 tokens= ." in %%A Do (something) Echo %%A 或 For /f "tokens= ." in %%A (something) Do %%L
  • 到目前为止你尝试过什么?请分享!我看到两个选项:1.for /F "usebackq tokens=12 delims=. " %%I in ("yourfile.txt") do echo(%%I(delims 中的 space 必须是整个选项字符串中的最后一个字符),或 2.for /F "usebackq delims=" %%L in ("yourfile.txt") do set "LINE=%%L" & echo(!LINE:~56,8!(启用delayed expansion );
  • @Noodles,您似乎混淆了选项字符串中的tokens 和delims 关键字;要在delims 中包含一个空格,您需要将其声明为整个选项字符串的最后一个字符...
  • 请不要更改您的问题的要求,尤其是之前已经回答过的问题!考虑到答案可能看起来不完整,甚至是错误的。解决新问题:取my answer,将tokens=4替换为tokens=4,5,然后将@echo(%%I替换为@echo(%%I %%K...

标签: loops batch-file cmd token


【解决方案1】:

两种可能的解决方案。

第一个使用与 aschipfl 的答案相同的想法,只是稍微精致一点,记住 delims=TAB:

@(For /f "UseBackQTokens=4Delims=   " %%A In ("pagedata.txt"
) Do @Echo=%%~nA)>another.txt

第二个使用句点作为分隔符:

@(For /f "UseBackQTokens=4Delims=." %%A In ("pagedata.txt"
) Do @For %%B In (%%A.x) Do @If Not "%%~xB"=="" Echo=%%~nB)>another.txt

只需更改 pagedata.txt 的输入文件名和 another.txt 的输出文件名以适合您的目的。

【讨论】:

  • ...可能看起来,但尝试一下,你会发现它们不是必需的
  • 嗯。好吧,我没想到:)
  • 第二个很有魅力,可以从第一个选项中产生任何东西,第二个如何工作,很想知道,谢谢!!
  • 第一个也有效我错过了delims后的标签,到底是怎么用这么少的代码做到的!?大声笑
  • 所有答案都是完美的,并且完全按照需要做,我要勾选这个,任何一个都可以勾选,但只是因为它是一个整洁的小班轮(或 2 个,取决于哪个一)。
【解决方案2】:

您的数据似乎是一个由六列组成的 TAB 分隔表。您要提取的部分字符串位于第四列。所以让我们使用for /F 循环来获取第四个标记(注意delims= 后面有一个TAB 字符):

for /F "usebackq tokens=4 delims=   " %%J in ("inputfile.txt") do echo(%%J

这会提取像ID0006962.CENTRAL 这样的字符串。现在让我们用另一个 for /F 循环分割这个字符串:

for /F "tokens=1 delims=." %%I in ("ID0006962.CENTRAL") do echo(%%I

然后让我们使用重定向将数据输出到文本文件:

> "outputfile.txt" echo(ID0006962

最后让我们把所有这些东西放在一起得到一个工作脚本:

> "outputfile.txt" (
    for /F "usebackq tokens=4 delims=   " %%J in ("inputfile.txt") do @(
        for /F "tokens=1 delims=." %%I in ("%%J") do @echo(%%I
    )
)

【讨论】:

  • 这也有效!谢谢, usebackq 标记和只是标记之间有什么区别,我正在查看这个并看到一些东西,所以顶行抓取了六列中的第四列,第二列抓取了第 4 列中 delim 之前的所有内容,即 .并吐出文字?
  • 在命令提示符窗口中输入for /? 并阅读帮助;你会发现usebackq 控制了() 中用于将部分括起来的引号的含义......是的,你完全明白了代码的作用......
【解决方案3】:
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q40784266.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO CALL :process %%a
)>"%outfile%"

GOTO :EOF

:process
FOR /f "tokens=1,2delims=." %%q IN ("%1") DO IF "%%r" equ "CENTRAL" (
 echo %%q
 GOTO :eof
) ELSE (
 SHIFT
 GOTO process
)

GOTO :eof

您需要更改sourcedir 的设置以适应您的情况。 您需要更改sourcedir 和destdir 的设置以适应您的情况。

我使用了一个名为 q40784266.txt 的文件,其中包含我的测试数据。

生成定义为 %outfile% 的文件

将输入文件的每一行读取到%%a,并调用:process,将整行作为参数传递。

:process 采用提供的第一个参数 (24) 并尝试使用 . 作为分隔符解析为标记。如果第二个令牌(在%%r 中)不是“CENTRAL”,则shift 参数并重试。

"Nov","2016","09:45","GMT" 每个都没有第二个标记,所以 shift
“194.176.105.132”的第二个标记“176”不匹配,所以 shift
"United","Kingdom" 没有第二个标记,所以换档
“ID006962.CENTRAL”有第二个标记,它匹配“CENTRAL”,所以打印第一个,“ID006962”并走到最后,放弃剩余的参数“3.10.6.0”和“Remove”

请注意,Central African Republic 之类的字符串不会通过测试,因为 CENTRAL 的匹配项区分大小写,而 "Central" 无论如何都没有第二个标记。

请注意,某些语法元素是布局敏感的。建议使用文本编辑器进行剪切和粘贴,而不是可能默默“格式化”代码的文字处理器。请注意,NOTEPAD 也倾向于格式化代码。我使用EDITPLUS。

【讨论】:

  • 嘿,感谢所有这些答案,当我有一点空闲时间时会报告。欣赏它:)
  • 这也很有魅力我有点理解但不知道你如何选择tokens=1和2 delims=。谢谢您可能会尝试了解更多
  • 标记和分隔符很容易。取字符串123.w#q.456。如果delims 是.,那么字符串中有3 个标记,123、w#q 和456。 # 有 2 个,123.w & q.456。 #. 有 4 个,123,w,q & 456。 Tokens 允许您按数字选择令牌。选择的最小数字进入指定的元变量(循环控制变量),下一个按字母顺序选择下一个,依此类推。所以tokens=2,4delims=#." %%a 然后%%a 得到w 和%%b 得到456。任何选定的分隔符序列都算作一个,并且任何前导分隔符都将被忽略。
  • 啊,好吧,可以尝试一下文本的 sn-p 并玩弄,然后我会开始掌握它的窍门。非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多