我有一个笨拙的文本文件(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
任何帮助都会很棒-谢谢!
答案 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)
此答案基于我的评论和您随后的建议,即这些行可能包含一个未知的用单句点分隔的字母数字字符串,而不是已知的:
来自batch-file:
@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
直接在cmd中:
For /F "Delims=" %A In ('""%__AppDir__%findstr.exe" /X "^[A-Z0-9]*\.[A-Z0-9]*$" "hosts.txt" 2>NUL"')Do @Echo %~nA