从文本文件中提取部分句子

时间:2019-07-18 09:29:25

标签: batch-file cmd token

我有一个笨拙的文本文件(hosts.txt),我需要从以下位置提取句子的特定部分:-

18 Jul 2019 09:30 BST
62.172.169.12
United Kingdom 
H82640A745.XGPH82640
3.12.21.0
Remove
18 Jul 2019 09:29 BST
62.172.169.9
United Kingdom 
H82640A744.XGPH82640
3.12.21.0
Remove
18 Jul 2019 09:26 BST
62.172.169.18
United Kingdom 
H82640A740.XGPH82640
3.12.21.0
Remove

我只需要.XGPH82640旁边的H *********号-因此从示例中,我只需要一个列表:-

H82640A745
H82640A744
H82640A740

以此类推...

我正在尝试批量使用令牌和delims进行提取,但是我什么也没得到。如果我尝试使用Skip = X行数,则该行将不起作用,因为第一个H *******数字上面有三行,但从那时起就有5行。

我已经阅读了关于令牌和delims的SS64,因为我真的很想能够自己弄清楚这一点,但我不明白。特别是与此文本文件。

此刻,我尝试使用“:”作为分隔符,但令牌编号再次更改,因此,如果它只是前五行

For /F "Tokens=4 delims=:" %%A In (hosts.txt) Do echo %%A

任何帮助都会很棒-谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在批处理文件中使用以下命令行:

for /F "tokens=1,2 delims=." %%I in (hosts.txt) do if "%%J" == "XGPH82640" echo %%I

FOR (忽略空行)逐行读取文件hosts.txt

使用delims=.将字符串定界符从默认普通空间或水平制表符修改为字符.

此任务感兴趣的是具有两个点分隔子串的行,其中第二个子串应为XGPH82640。因此,使用tokens=1,2来获得分配给循环变量I的第一个点分隔字符串,并根据ASCII table分配给分配给下一个循环变量J的第二个点分隔字符串。

如果删除所有前导.后的第一个子字符串以分号开头,则命令 FOR 也会忽略该行,因为eol=;是行尾的默认设置字符。但是可以假设,没有XGPH82640的行以;开头,因此默认行尾字符可以保持原样。

区分大小写的 IF 条件验证第二个点分隔的字符串是否真的为XGPH82640,而不是带有日期/时间或国家/地区或十进制的行上的空字符串编号,与带有IPv4地址的行中的编号相同。

在正确的 IF 条件下,第一个点分隔的字符串将输出到控制台。

答案 1 :(得分:1)

此答案基于我的评论和您随后的建议,即这些行可能包含一个未知的用单句点分隔的字母数字字符串,而不是已知的:

来自

@Echo Off
If Not Exist "hosts.txt" GoTo :EOF
For /F "Delims=" %%A In (
    '""%__AppDir__%findstr.exe" /X "^[A-Z0-9]*\.[A-Z0-9]*$" "hosts.txt""'
) Do Echo %%~nA
Pause

直接在中:

For /F "Delims=" %A In ('""%__AppDir__%findstr.exe" /X "^[A-Z0-9]*\.[A-Z0-9]*$" "hosts.txt" 2>NUL"')Do @Echo %~nA